Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

практика научная / Практика_отчёт_БИК2205

.pdf
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
753.25 Кб
Скачать

88. return mixed_signal

89.

90.#Кодирование

91.def encoder(samples: typ.List[typ.List]) -> typ.List[typ.List]:

92.#Необходимые для кодирования величины

93.array_diff = [[0],[0]]

94.array_diff[0][0] = samples[0][0]

95.array_diff[1][0] = samples[1][0]

96.counter = 1

97.while counter != len(samples[0]):

98.

array_diff[0].append(samples[0][counter]-

samples[0][counter-1])

99.

array_diff[1].append(samples[1][counter]-

samples[1][counter-1])

100.

counter += 1

101.

return array_diff

102.

 

103.#Декодирование

104.def decoder(samples: typ.List[typ.List]) -> typ.List[typ.List]:

105.#Необходимые для декодирования величины

106.array_rslt = [[0],[0]]

107.array_rslt[0][0] = samples[0][0]

108.array_rslt[1][0] = samples[1][0]

109.counter = 1

110.while counter != len(samples[0]):

111.

array_rslt[0].append(samples[0][counter]+array_rslt[

0][counter-1])

112.

array_rslt[1].append(samples[1][counter]+array_rslt[

1][counter-1])

113.

counter += 1

114.

return array_rslt

115.

 

116.#Вывод волнового представления аудио

117.def show_waveform(array: npt.ArrayLike,number: int,sr: float,title: str='Waveform',label: str='Waveform') -> None:

118.plt.figure(number)

119.if type(array) == 'nd.array':

120. waveshow(array,sr=sr,label=label)

121.else:

122. waveshow(np.array(array),sr=sr,label=label)

123.if label != 'Waveform':

124.

plt.legend()

125.

plt.title(title)

126.

 

127.#Инициализация окна при запуске программы

128.w = curses.wrapper(init_cnvs)

129.#Проверка размеров окна на подходящие для работы

130.if curses.COLS < 71 or curses.LINES < 21:

131.curses.endwin()

20

132.print(f'Размер окна консоли слишком мал и составляет

{curses.COLS} на {curses.LINES} пикселей.\

133.\nУвеличьте размер окна консоли до 71 на 21 пикселей и запустите программу заново.')

134.exit()

135.else:

136.pass

137.

138.#Считывание аудиофайла

139.draw_text(w,1,1,'Вас приветствует Кривая Имитация Реализации Кодека Aptx (К.И.Р.К.А.)!')

140.draw_text(w,2,1,'Для дальнейшей работы необходимо указать путь к .wav файлу.')

141.audio_file_input: str = get_text(w,3,1) #Исходный файл

142.if isfile(audio_file_input) == True: #Проверка существования

файла

143.draw_text(w,4,1,'Файл успешно найден! Загружаю.')

144.samples_orig, sample_rate = lbrs_load(audio_file_input,sr=44100,mono=False,duration=None,dtyp e='float64')

145.draw_text(w,5,1,'Загрузка завершена.')

146.else:

147.draw_text(w,4,1,'Файл не найден, повторите попытку ещё

раз.')

148.draw_text(w,5,1,'Программа завершится через две секунды.')

149.draw_text(w,6,1,'До свидания!')

150.curses.napms(1500)

151.exit()

152.

153.#Фильтрация по диапазонам (Адаптивное кодирование)

154.friq_bands:

typ.Tuple[typ.Tuple[int,int],typ.Tuple[int,int],typ.Tuple[int,int ],typ.Tuple[int,int]]\

155.= ((1,5500),(5501,11000),(11001,16500),(16501,22000))

#Необходимые диапазоны частот

156.bytes_for_each_fb:

typ.Tuple[npt.DTypeLike,npt.DTypeLike,npt.DTypeLike,npt.DTypeLike ]\

157.= ('float64','float32','float16','float16') #Кол-во байт на значение отсчётов в каждом диапазоне

158.filtered_samples: typ.List[npt.NDArray] = [] #Список под разбитое по диапазонам аудио

159.counter: int = 0

160.perf: int = perf_counter_ns()

161.draw_text(w,7,1,'Произвожу фильтрацию по диапазонам частот.')

162.for i in friq_bands:

163.filtered_samples.append(filtration(samples_orig,sample_r ate,i,bytes_for_each_fb[counter]))

164.counter += 1

165.draw_text(w,8,1,f'{counter} диапазон выделен!')

21

166.counter = 0

167.draw_text(w,8,1,f'Готово! Управилась за {(perf_counter_ns()- perf)/10**9:0.3f} с.')

168.#Структура filtered_samples[диапазон][канал][значение]

169.

170.#Объединение в один «аудиофайл»

171.

filtered_audio:

typ.List[typ.List]

=

signal_mixing(filtered_samples)

 

 

172.

del filtered_samples

 

 

173.

 

 

 

174.#Кодирование

175.draw_text(w,9,1,'Произвожу кодирование.')

176.perf = perf_counter_ns()

177.encoded_audio: typ.List[typ.List] = encoder(filtered_audio)

178. draw_text(w,10,1,f'Готово! Управилась за

{(perf_counter_ns()-perf)/10**9:0.3f} с.') 179.

180.#Декодирование

181.draw_text(w,11,1,'Произвожу декодирование.')

182.perf = perf_counter_ns()

183.decoded_audio: typ.List[typ.List] = decoder(encoded_audio)

184.

draw_text(w,12,1,f'Готово!

Управилась

за

{(perf_counter_ns()-perf)/10**9:0.3f} с.')

 

 

185.

del encoded_audio

 

 

186.

 

 

 

187.#Вывод на экран волнового представления аудио

188.draw_text(w,13,1,'Формирую графики.')

189.perf = perf_counter_ns()

190.show_waveform(samples_orig,1,sample_rate,'Original audio')

191.show_waveform(filtered_audio,2,sample_rate,'Filtered audio')

192.show_waveform(decoded_audio,3,sample_rate,'Encoded-decoded audio')

193.show_waveform(samples_orig,4,sample_rate,label='Original')

194.show_waveform(filtered_audio,4,sample_rate,'Original and filtered audio','Filtered')

195.

draw_text(w,14,1,f'Готово!

Управилась

за

{(perf_counter_ns()-perf)/10**9:0.3f} с.')

 

 

196.del perf

197.del samples_orig

199.#Указание путей для вывода результата и запись в аудиофайл

200.draw_text(w,16,1,f'Я закончила работу. Желаете вывести результат? y|n')

201.flag: str = get_char(w,17,1)

202.if flag == 'y':

203.draw_text(w,17,1,f'ОК. Итоговый или только после фильтрации? r|f')

204.flag = get_char(w,18,1)

205.if flag == 'r':

206. draw_text(w,18,1,f'ОК. Укажите путь к файлу вывода

(с .wav).')

22

207. audio_file_output_decoded: str = get_text(w,19,1)

#Файл вывода для итогового аудио

208. sf_write(audio_file_output_decoded,np.array(decoded_ audio,dtype='float64').T,sample_rate,subtype='PCM_16') #Запись результата в аудиофайл

209. draw_text(w,19,1,f'Я закончила! Не забудьте про графики!')

210.elif flag == 'f':

211. draw_text(w,18,1,f'ОК. Укажите путь к файлу вывода

(с .wav).')

212. audio_file_output_filtered: str = get_text(w,19,1)

#Файл вывода для фильтрованного аудио

213. sf_write(audio_file_output_filtered,np.array(filtere d_audio,dtype='float64').T,sample_rate,subtype='PCM_16') #Запись результата в аудиофайл

214. draw_text(w,19,1,f'Я закончила, до свидания! Не забудьте про графики!')

215.else:

216. draw_text(w,18,1,f'Что ж. Без результатов, так без результатов.')

217. draw_text(w,19,1,f'Хорошо. Тогда я закончила! Не забудьте про графики!')

218.elif flag == 'n':

219.draw_text(w,17,1,f'Хорошо. Тогда я закончила! Не забудьте закрыть графики!')

220.

221.plt.show()

222.curses.endwin()

23

Соседние файлы в папке практика научная