Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中陷波滤波器的设计_Python_Filtering_Signal Processing - Fatal编程技术网

Python中陷波滤波器的设计

Python中陷波滤波器的设计,python,filtering,signal-processing,Python,Filtering,Signal Processing,我正在尝试使用numpy数组和scipy库在python中设计一个IIR陷波滤波器,以从导入的wave文件中删除正弦音(我正在使用wave模块来实现这一点)。我的文件是由Adobe audition生成的:它是一个纯正弦@1.2 kHZ,采样频率为48、96或192 kHZ,以获得循环fft的“伪周期”数据(只要问我是否不够清楚即可) 下面是我用来实现过滤器系数的代码(我从文章中获得系数) 其中,data\u flt\u R是一个numpy数组,包含float64类型的右通道,rate是我的采样

我正在尝试使用numpy数组和scipy库在python中设计一个IIR陷波滤波器,以从导入的wave文件中删除正弦音(我正在使用wave模块来实现这一点)。我的文件是由Adobe audition生成的:它是一个纯正弦@1.2 kHZ,采样频率为48、96或192 kHZ,以获得循环fft的“伪周期”数据(只要问我是否不够清楚即可)

下面是我用来实现过滤器系数的代码(我从文章中获得系数)

其中,
data\u flt\u R
是一个numpy数组,包含float64类型的右通道,
rate
是我的采样频率。我使用matplotlib模块绘制数据的频率响应和fft,以查看是否一切正常

N = len(data_flt_R)    

w, h = signal.freqz(B,A, N)
pyplot.subplot(2,1,1)
pyplot.semilogx(w*rate/(2*np.pi), 20*np.log10(np.absolute(h)))    

fft1 = fftpack.fft(data_flt_R, N)
fft_abs1 = np.absolute(fft1)
ref = np.nanmax(fft_abs1)
dB_unfiltered = 20*np.log10(fft_abs1/ref)

fft2 = fftpack.fft(filtered, N)
fft_abs2 = np.absolute(fft2)
dB_filtered = 20*np.log10(fft_abs2/ref)

abs = fftpack.fftfreq(N,1.0/rate)

pyplot.subplot(2,1,2)
pyplot.semilogx(abs,dB_unfiltered,'r', label='unfiltered')
pyplot.semilogx(abs,dB_filtered,'b', label='filtered')
pyplot.grid(True)
pyplot.legend()
pyplot.ylabel('power spectrum (in dB)')
pyplot.xlim(10,rate/2)
pyplot.xlabel('frequencies (in Hz)')
下面是我得到的:

我不明白在我的fc之前和之后得到的结果和值。我不应该得到一块看起来像红色的但没有主峰的地块吗?为什么HF中有坡度?这是否与窗口相关


此外,如果我改变采样频率和/或数据长度(16/24或32位),结果也会改变。有人能给我一些启发吗?

看看时域中的滤波信号。您的IIR滤波器将完全消除正弦信号,但在信号的最开始处会有几个启动瞬态样本。“滤波”频谱看起来接近脉冲,即整个信号中的两个非零样本。另外,请注意,您的垂直轴非常大-在振幅刻度上很少看到超过100 dB(100000的比率)。这就是为什么你可以看到16位和32位之间的量化差异。我检查了滤波信号的时间表示,这正是你所期望的。谢谢你的建议:)我投票结束这个问题,因为它更适合math.stackexchange
N = len(data_flt_R)    

w, h = signal.freqz(B,A, N)
pyplot.subplot(2,1,1)
pyplot.semilogx(w*rate/(2*np.pi), 20*np.log10(np.absolute(h)))    

fft1 = fftpack.fft(data_flt_R, N)
fft_abs1 = np.absolute(fft1)
ref = np.nanmax(fft_abs1)
dB_unfiltered = 20*np.log10(fft_abs1/ref)

fft2 = fftpack.fft(filtered, N)
fft_abs2 = np.absolute(fft2)
dB_filtered = 20*np.log10(fft_abs2/ref)

abs = fftpack.fftfreq(N,1.0/rate)

pyplot.subplot(2,1,2)
pyplot.semilogx(abs,dB_unfiltered,'r', label='unfiltered')
pyplot.semilogx(abs,dB_filtered,'b', label='filtered')
pyplot.grid(True)
pyplot.legend()
pyplot.ylabel('power spectrum (in dB)')
pyplot.xlim(10,rate/2)
pyplot.xlabel('frequencies (in Hz)')