python - 使用 scipy 对截止频率进行建模
问题描述
我正在努力为扬声器编写交叉滤波器。此函数旨在创建一个虚拟输入信号,然后可以对其进行滤波,但是当我在调用该函数时更改频率和顺序时,它将不再在图表上正确绘制滤波后的频率。
在 scipy 网站上,他们说建议在过滤时使用二阶部分格式,以避免传递函数(ba)格式出现数字错误,但我现在不确定这是最好的解决方案,或者我在这里忽略了一个简单的错误.
看:
sosfilt:https ://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.sosfilt.html#scipy.signal.sosfilt
黄油: https ://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html#scipy.signal.butter
更新 - 这似乎发生在更高的频率(我使用 3000 Hz 截止)与 .butter、.sosfilt 和 .irrfilter、.lfilter 命令
from scipy.signal import butter, sosfilt
import matplotlib.pyplot as plt
import numpy as np
def demo(f_s=1000,fc=15,fmin=10,fmax=20,n=10,nf=2):
# demo filtered signal
t = np.linspace(0,(15/fc),f_s,False) # sample size should give roughly ten peaks
# generate signal
inputf = np.linspace(fmin,fmax,nf)
# starts off with only the two frequencies,
# can add more to check how the filter will respond
sig = 0
for i in inputf:
sig += np.sin(2*np.pi*i*t)
# returns the filtered signal over a given time
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t, sig)
ax1.set_title('Initail sinusoidial signal from {} to {} Hz'.format(fmin,fmax))
ax1.axis([0, (15/fc), -nf, nf])
sosh = butter(n, fc, 'hp', fs=f_s, output='sos') #highpass
sosl = butter(n, fc, 'lp', fs=f_s, output='sos') #lowpass
filteredh = sosfilt(sosh, sig) #filtered high-pass
filteredl = sosfilt(sosl, sig) #filtered low-pass
ax2.plot(t, filteredh) # visualised high-pass signal
ax2.plot(t, filteredl) # visualised low-pass signal
ax2.set_title('After {} Hz Cut-off (high and low)-pass filter'.format(fc))
ax2.axis([0, (15/fc), -nf, nf])
ax2.set_xlabel('Time [seconds]')
plt.tight_layout()
plt.show()
demo()
解决方案
棘手。我认为您对时基有混淆。f_s 应该是采样频率,并且您生成 f_s 样本,它总是一整秒。但是当 fc=3000 时,您只将 X 轴显示为 0 到 0.005 秒。此外,当 fc=15 时,您会生成f_s
从 0 到 1 的时间样本。但是当 fc=3000 时,您的时基只会从 0 到 1/200 运行,即使您应该生成一整秒的数据。
我将时基更改为
t = np.linspace(0,1,f_s,False)
我认为它更接近你的期望。
推荐阅读
- assembly - 这个汇编程序的堆栈是如何工作的?
- python - 如果数据库包含某个值,则将 x 数量添加到变量(python)
- html - 在月亮上停止 css 关键帧翻转动画,如月相
- tensorflow - 谷歌云 GPU 机器突然重启
- java - 将变量转换为 Big O 中的原始操作吗?
- php - 我无法到达表格的 td 标签
- java - 从 Firebase 数据库中检索计数数据
- python - 除了手动之外,如何在 Matplotlib 中“暂停”、“恢复”和“重置”默认颜色循环?
- php - Apache 2.4 PHP 启动:无法加载动态库 'curl.so'、libcurl.4.dylib
- go - 如何使用 go 获取两位数的当前小时和分钟?