Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
2.85 Кб
Скачать
from librosa import load as lbrs_load
import numpy as np
from os.path import getsize
from soundfile import write as sf_write
from scipy.signal import firwin

#Кодирование
def encoder(samples):
	#Необходимые для кодирования величины
	array_diff = np.zeros(samples.shape)
	array_diff[0][0] = samples[0][0]
	array_diff[1][0] = samples[1][0]
	counter = 1

	while counter != len(array_diff[0]):
		array_diff[0][counter]= samples[0][counter]-samples[0][counter-1]
		array_diff[1][counter]= samples[1][counter]-samples[1][counter-1]
		counter += 1
	return array_diff

#Декодирование
def decoder(samples):
	#Необходимые для декодирования величины
	array_rslt = np.zeros(samples.shape)
	array_rslt[0][0] = samples[0][0]
	array_rslt[1][0] = samples[1][0]
	counter = 1

	while counter != len(samples[0]):
		array_rslt[0][counter]= samples[0][counter]+array_rslt[0][counter-1]
		array_rslt[1][counter]= samples[1][counter]+array_rslt[1][counter-1]
		counter += 1
	return array_rslt

#Синтез полосовых КИХ-фильтров
def filters_coeffs(sr,nt=3):
	#Необходимые частоты полос пропускания
	coeffs = []
	freqs_bands = [[0.1,5500],[5501,11000],[11001,16500],[16500,22000]]
	for i in freqs_bands:		
		coeffs.append(firwin(numtaps=nt+1,cutoff=i,pass_zero=False,fs=sr))
	return coeffs

#Фильтрация
def filtration(samples,coeffs,sr,nt=3):
	filtered_array = [[],[]]
	for i in range(0,len(samples[0])):
		tmp = [0,0]
		if i <= N:
			c = 0
			k = i
			while True:
				tmp[0] += coeffs[c]*samples[0][k]
				tmp[1] += coeffs[c]*samples[1][k]
				if k == 0:
					break
				c += 1
				k -= 1
			filtered_array[0].append(tmp[0])
			filtered_array[1].append(tmp[1])
		else:
			c = 0
			k = i
			while True:
				tmp[0] += coeffs[c]*samples[0][k]
				tmp[1] += coeffs[c]*samples[1][k]
				if c == N:
					break
				c += 1
				k -= 1
			filtered_array[0].append(tmp[0])
			filtered_array[1].append(tmp[1])
	return filtered_array

#Считывание аудиофайла
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=1)

#Фильтрация по диапазонам
N = 3 #Порядок фильтра
filters_coeffs = filters_coeffs(sample_rate, N)
filtered_samples = filtration(samples_orig,filters_coeffs[1],sample_rate,N)

print(f' {min(filtered_samples[0])}\n {max(filtered_samples[0])}\n \
{min(samples_orig[0])}\n {max(samples_orig[0])}')

samples_diff = encoder(samples_orig)
samples_rslt = decoder(samples_diff)

sf_write(audio_file_output,samples_rslt.T,sample_rate,subtype='PCM_16')
Соседние файлы в папке результат