将巴特沃斯滤波器(低通)应用于信号

信息处理 Python 低通滤波器 过滤 巴特沃思
2022-02-14 09:44:52

我在一个 DSP 实验室工作,我不知道如何将我创建的过滤器应用到声音中。我在网上发现的唯一对我的声音有影响的东西是,signal.filtfilt但这似乎只是出于某种原因输出了静音。

import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
import librosa

sf = 44100
t = np.arange(0., 0.5+1./sf, 1./sf)
totalTime = 0.5

mysound = totalTime * np.sin(2*np.pi*697*t) + totalTime * np.sin(2*np.pi*1477*t)

#Creation of the filter
N  = 6    # Filter order
fc = 1000/3000 # Cutoff frequency, normalized 
b, a = signal.butter(N, fc)

#Apply the filter
tempf = signal.filtfilt(b,a, mysound)
librosa.output.write_wav('3mod.wav',tempf,sf)

我想我要么在创建过滤器时犯了一个错误,要么就是找不到正确的方法来应用它。由于我对 DSP 很陌生,我无法真正理解所有文档材料,所以我可能只是忽略了我一直在阅读的文档之一中的一些简单内容,但我不知道是什么。

编辑:当我将过滤器创建代码更改为

#Creation of the filter
cutOff = 1000 # Cutoff frequency
nyq = 0.5 * sf
N  = 6    # Filter order
fc = cutOff / nyq # Cutoff frequency normal
b, a = signal.butter(N, fc)

所以似乎对奈奎斯特频率的计算错误让我沉默了。我不是 100% 确定这.filtfilt是部署过滤器的正确(或唯一)方法。

把问题留在这里,以防它帮助别人。

1个回答

我找到了一种通过更改计算来解决问题的方法,所以看起来我的奈奎斯特频率有误,因此截止频率也有误。我没有意识到这种情况下的奈奎斯特频率不需要应用于声音中存在的最高频率,而是应用于用于生成声音的采样频率(现在我知道这听起来很傻)。

答案(也在问题的编辑部分)是:

#Creation of the filter
cutOff = 1000 # Cutoff frequency
nyq = 0.5 * sf
N  = 6    # Filter order
fc = cutOff / nyq # Cutoff frequency normal
b, a = signal.butter(N, fc)

.filtfilt方法不起作用,因为我的过滤器错误。