IIR 滤波测试

本文详细介绍了如何使用MATLAB生成滤波器参数,并将其转换为C语言代码进行实时信号处理。通过对比静态浮点测试函数与MATLAB生成的IIR滤波器,验证了两者在信号处理效果上的高度一致性。

1.使用matlab产生产生参数。

static float test_f(float input)
{
	static float xv[2+1], yv[2+1];
	xv[0] = xv[1]; xv[1] = xv[2]; 
	xv[2] = input/ 1.949595788e+02;
	yv[0] = yv[1]; yv[1] = yv[2]; 
	yv[2] =   (xv[0] + xv[2]) + 2 * xv[1]
				 + ( -0.8079495914 * yv[0]) + (  1.7874325180 * yv[1]);
	return yv[2];
}

static float iir_filter_matab(float input)
{
	//y[n] = 1*x[n] + 2*x[n-1] + 1*x[n-2] - (-1.1429805025)*y[n-1] - (0.412801596)*y[n-2]
	// matlab 都是二阶滤波级联
	double gain =  0.005129268366107;
	float table_N[3] = {1,2,1};
	float table_D[3] = { 1,   -1.787432517956,   0.8079495914209};
	static float xv[3], yv[3];
	xv[2] = input*gain;
	xv[0] = xv[1]; xv[1] = xv[2]; 
	yv[0] = yv[1]; yv[1] = yv[2]; 
	yv[2] = table_N[0]*xv[2]+table_N[1]*xv[1]+table_N[2]*xv[0] - table_D[1]*yv[1] - table_D[2]*yv[0];
	
	return yv[2]; 
}

   y[n]=b0⋅x[n]+b1⋅x[n−1]+b2⋅x[n−2]−a1⋅y[n−1]−a2⋅y[n−2]

matlab 中高阶滤波是用二阶滤波级联。

测试和网页版生成的代码 滤波效果基本上一样。

 

网页版生成 C语言

https://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

总结方差为数据离散度。

 

### 批量 IIR 滤波的实现 在 Python 中,可以利用 `scipy` 库中的 `signal.iirfilter` 函数来设计 IIR 滤波器,并通过批量操作对多个信号进行滤波处理。以下是详细的实现方式。 #### 设计 IIR 滤波器 `scipy.signal.iirfilter` 是用于设计任意类型的 IIR 滤波器的核心函数。可以通过指定参数如阶数 (`N`) 和截止频率 (`Wn`) 来定义滤波器特性[^4]。对于批量处理的需求,通常先创建一组统一的滤波器系数,随后将其应用于不同的输入信号。 #### 示例代码 以下是一个完整的示例代码,展示如何使用 `iirfilter` 对一批信号执行低通 IIR 滤波: ```python import numpy as np from scipy import signal import matplotlib.pyplot as plt # 参数设置 fs = 1000 # 采样率 (Hz) nyquist = fs / 2 # 奈奎斯特频率 cutoff_freq = 50 # 截止频率 (Hz) order = 4 # 滤波器阶数 # 创建 IIR 滤波器 b, a = signal.iirfilter(order, cutoff_freq / nyquist, btype='low', ftype='butter') # 构造多组测试信号 t = np.linspace(0, 1, int(fs), endpoint=False) # 时间向量 frequencies = [10, 50, 100, 200] # 不同频率分量 signals = [] for freq in frequencies: signals.append(np.sin(2 * np.pi * freq * t)) # 将信号组合成二维数组以便批量处理 batch_signals = np.array(signals) # 使用 lfilter 进行批量滤波 filtered_batch = np.apply_along_axis(lambda sig: signal.lfilter(b, a, sig), axis=1, arr=batch_signals) # 可视化原始信号与滤波后的信号 fig, axes = plt.subplots(len(frequencies), 2, figsize=(12, 8)) for i, freq in enumerate(frequencies): axes[i][0].plot(t, batch_signals[i]) axes[i][0].set_title(f"Original Signal ({freq} Hz)") axes[i][1].plot(t, filtered_batch[i]) axes[i][1].set_title(f"Filtered Signal ({freq} Hz)") plt.tight_layout() plt.show() ``` 上述代码实现了以下几个功能: 1. 定义了一个四阶巴特沃斯低通滤波器,其截至频率为 50 Hz。 2. 利用正弦波生成不同频率成分的模拟信号。 3. 将这些信号存储在一个二维 NumPy 数组中,便于后续批量处理。 4. 调用了 `np.apply_along_axis` 方法逐一对每条信号调用 `lfilter` 函数完成滤波。 5. 绘制了原始信号及其对应的滤波结果以验证效果。 #### 关键点解析 - **滤波器设计**:`iirfilter` 支持多种经典滤波器类型(如 Butterworth、Chebyshev),并允许灵活调整阶数和频带范围。 - **批量处理**:借助 NumPy 的高效矩阵运算能力以及 SciPy 提供的矢量化工具,能够显著简化程序逻辑并提升性能。 - **可视化辅助分析**:通过对比原图与滤波后图形,直观评估算法的有效性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值