Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
5.31 Кб
Скачать
from scipy.signal import firwin, lfilter, kaiserord
from soundfile import write as sf_write
from librosa import load as lbrs_load
from librosa.display import waveshow
from matplotlib import pyplot as plt
import numpy as np

#Фильтрация
def filtration(samples,sr,cutoff_hz,bts):
	nyq_rate = sr/2.0 #Частота Найквиста
	trans_width = 5.0/nyq_rate #Ширина перехдной зоны
	ripple_db = 15.0 #Величина затухание вне области пропускания
	N, beta = kaiserord(ripple_db, trans_width) #Порядок и параметр Кайсера
	filter_coeffs = firwin(N,cutoff_hz,window=('kaiser',beta),pass_zero='bandpass',fs=sr) #Получение коэффициентов фильтра
	filtered_samples = lfilter(filter_coeffs,1.0,samples,axis=1) #Фильтрация
	filtered_samples[0][abs(filtered_samples[0])<=1/((ripple_db/10)**10)] = 0 #Фильтрация по затуханию
	filtered_samples[1][abs(filtered_samples[1])<=1/((ripple_db/10)**10)] = 0 #Фильтрация по затуханию
	filtered_samples = filtered_samples.astype(bts)
	return filtered_samples

#Сведение всех отфильтрованных сигналов в один
def signal_mixing(f_samples):
	counter = 0
	mixed_signal = [[],[]]
	while counter != len(f_samples[0][0]):
		if f_samples[0][0][counter] != 0:
			#
			mixed_signal[0].append(f_samples[0][0][counter])
			mixed_signal[1].append(f_samples[0][1][counter])
			#
		elif f_samples[1][0][counter] != 0:
			#
			mixed_signal[0].append(f_samples[1][0][counter])
			mixed_signal[1].append(f_samples[1][1][counter])
			#	
		elif f_samples[2][0][counter] != 0:
			#
			mixed_signal[0].append(f_samples[2][0][counter])
			mixed_signal[1].append(f_samples[2][1][counter])
			#	
		else:
			#
			mixed_signal[0].append(f_samples[3][0][counter])
			mixed_signal[1].append(f_samples[3][1][counter])
			#
		counter += 1
	return mixed_signal

#Кодирование
def encoder(samples):
	#Необходимые для кодирования величины
	array_diff = [[0],[0]]
	array_diff[0][0] = samples[0][0]
	array_diff[1][0] = samples[1][0]
	counter = 1
	while counter != len(samples[0]):
		array_diff[0].append(samples[0][counter]-samples[0][counter-1])
		array_diff[1].append(samples[1][counter]-samples[1][counter-1])
		counter += 1
	return array_diff

#Декодирование
def decoder(samples):
	#Необходимые для декодирования величины
	array_rslt = [[0],[0]]
	array_rslt[0][0] = samples[0][0]
	array_rslt[1][0] = samples[1][0]
	counter = 1
	while counter != len(samples[0]):
		array_rslt[0].append(samples[0][counter]+array_rslt[0][counter-1])
		array_rslt[1].append(samples[1][counter]+array_rslt[1][counter-1])
		counter += 1
	return array_rslt

#Вывод волнового представления аудио
def show_waveform(array,number,sr,title=None,label='Waveform'):
	plt.figure(number)
	if type(array) == 'nd.array':
		waveshow(array,sr=sr,label=label)
	else:
		waveshow(np.array(array),sr=sr,label=label)
	if label != 'Waveform':
		plt.legend()
	plt.title(title)

#Считывание аудиофайла
audio_file_input = "Eurobeat Brony - Diamond Dogs.wav" #Исходный файл
audio_file_output = "output_audio.wav" #Файл вывода
samples_orig, sample_rate = lbrs_load(audio_file_input,sr=44100,mono=False,duration=None,dtype='float64')

#Фильтрация по диапазонам (Адаптивное кодирование)
friq_bands = [[1,5500],[5501,11000],[11001,16500],[16501,22000]] #Необходимые диапазоны частот
bytes_for_each_fb = ['float64','float32','float16','float16'] #Кол-во байт на значение отсчётов в кааждом диапазоне
filtered_samples = []
counter = 0
for i in friq_bands:
	filtered_samples.append(filtration(samples_orig,sample_rate,i,bytes_for_each_fb[counter]))
	counter += 1
counter = 0
#Структура filtered_samples[диапазон][канал][значение]

#Объедининение в один «аудиофайл»
filtered_audio = signal_mixing(filtered_samples)

#Кодирование и декодирование
encoded_audio = encoder(filtered_audio)
decoded_audio = decoder(encoded_audio)

#Вывод на экран волнового представления аудио
show_waveform(samples_orig,1,sample_rate,'Original audio')
show_waveform(filtered_audio,2,sample_rate,'Filtered audio')
show_waveform(decoded_audio,3,sample_rate,'Encoded-decoded audio')
show_waveform(samples_orig,4,sample_rate,label='Original')
show_waveform(filtered_audio,4,sample_rate,'Original and filtered audio','Filtered')
#show_waveform(filtered_audio,5,sample_rate,label='Filtered')
#show_waveform(decoded_audio,5,sample_rate,'Encoded-decoded and filtered audio','Encoded-decoded audio')
plt.show()

#Запись результата в аудиофайл
#sf_write(audio_file_output,np.array(filtered_audio,dtype='float64').T,sample_rate,subtype='PCM_16')
#sf_write(audio_file_output,np.array(decoded_audio,dtype='float64').T,sample_rate,subtype='PCM_16')
Соседние файлы в папке результат