stackoverflow.com/questions/52502874/...
ел бы применить фильтр FIR или IIR (пример: фильтр нижних частот)на последовательных блоках / таймфреймах из 1024 образцов каждый.
Возможные применения:
в режиме реального времени обработка звука, такая как EQing. В точное время у нас есть только следующие 1024 семпла в буфере. Следующие образцы для обработки еще не доступны (в режиме реального времени).
сделать изменяющийся по времени фильтр, разделив входной сигнал на блоки, как это было предложенов этом ответе.
Я попробовал это здесь:
import numpy as np
from scipy.io import wavfile
from scipy.signal import butter, lfilter, filtfilt, firwin
sr, x = wavfile.read('input.wav')
x = np.float32(x)
y = np.zeros_like(x)
N = 1024 # buffer block size = 23ms for a 44.1 Khz audio file
f = 1000 # cutoff
pos = 0 # position
while True:
b, a = butter(2, 2.0 * f / sr, btype='low')
y[pos:pos+N] = filtfilt(b, a, x[pos:pos+N])
pos += N
f -= 1 # cutoff decreases of 1 hz every 23 ms, but the issue described here also present with constant cutoff!
print f
if pos+N > len(x):
break
y /= max(y) # normalize
wavfile.write('out_fir.wav', sr, y)
Я пытался:
оба с фильтром Баттерворта или РПИ (замените строку доb, a = firwin(1000, cutoff=f, fs=sr), 1.0
)
оба сlfilter
а такжеfiltfilt
(последний имеет преимущество в применении фильтра вперед и назад, и это решает вопросы фазы),
но вот проблема:
** На границах выходных данных каждого таймфрейма существует проблема непрерывности, которая делает аудиосигнал сильно искаженным.
Как решить эту проблему разрыва? Я думал о методе работы с окнами + OverlapAdd, но наверняка должен быть более простой способ.