Добавил:
chrysler_a57_mltbnk
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:практика научная / результат / test_3
.pyfrom 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
from os.path import getsize
from sys import getsizeof
import numpy as np
#Фильтрация
def filtration(samples,sr,cutoff_hz,fp,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
print(f'Mixing done!')
return mixed_signal
#Кодирование
def encoder(samples):
#Необходимые для кодирования величины
array_diff = np.zeros(samples.shape,dtype=samples.dtype)
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
#Декодирован1
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
#Считывание аудиофайла
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)
#Фильтрация по диапазонам
friq_bands = [[1,5500],[5501,11000],[11001,16500],[16501,22000]] #Необходимые диапазоны частот
bytes_for_each_fb = ['float64','float32','float16','float16'] #Кол-во байт на значение отсчётов в кааждом диапазоне
filter_precision = 10**-4 #Точность фильтрации
filtered_samples = []
counter = 0
for i in friq_bands:
filtered_samples.append(filtration(samples_orig,sample_rate,i,filter_precision,bytes_for_each_fb[counter]))
counter += 1
counter = 0
#Структура filtered_samples[диапазон][канал][значение]
#Объедининение в один «аудиофайл»
filtered_audio = signal_mixing(filtered_samples)
sf_write(audio_file_output,np.array(filtered_audio,dtype='float64').T,sample_rate,subtype='PCM_16')
Соседние файлы в папке результат
