我正在编写一个 Python 函数,它将音频信号的频率降低到指定范围。我通过将时间序列与复指数相乘来执行降档,然后对结果进行低通滤波以消除低频移动到更高频率的循环效应。
该函数将用于在循环中逐块处理音频信号。我的问题是,启动索引会有什么影响每个块的复指数为零?
在哪里, 和是块长度。
直觉上,我认为块之间会有不一致的相移,但我不确定。
有没有办法避免这种情况,而无需在程序的整个生命周期中不断增加索引?
这是代码:
from numpy import fft, pi, r_, exp, int16, array, fromstring, zeros
from scipy.signal import firwin, lfilter
def shiftFreq(data, cutoff, fs, hist=None):
""" Downshift audio data
Parameters
------------
data: str
Binary data string of 16-bit audio data
cutoff: float
The new max frequency component after downshift and filtering
fs: float
Sample rate of audio data
hist: ndarray
Filter delay line
"""
data = fromstring(data, dtype=int16)
N = len(data)
num_taps = 128
delay = num_taps - 2
nyquist = fs/2
# initialize history
if hist is None:
hist = zeros(delay, dtype=data.dtype)
# Down-shift the data
shift = nyquist - cutoff
n = r_[0: N]
new_data = (data * exp(-1j * 2 * pi * shift * n/fs)).real
# Apply lowpass filter to remove cyclic effect
fir = firwin(num_taps, cutoff, nyq=nyquist)
new_data, hist = lfilter(fir, 1, new_data, zi=hist)
return int16(new_data).tostring(), hist
顺便说一句,在执行降档时我还应该注意哪些其他注意事项,而我在这里没有考虑到这些注意事项?