Matlab filter2函数一维信号滤波C语言

博客介绍了如何使用MATLAB的filter2函数生成和应用二维数字滤波器,并展示了如何将该滤波过程转换为C语言代码。作者通过创建FIR滤波器,生成信号,然后在MATLAB中进行滤波处理,最后在C语言中实现相同功能,验证了结果的一致性。虽然C代码与MATLAB代码相似,但博主指出仍有优化空间。

filter2,二维数字滤波器。

用法:Y = filter( X , H ) 根据矩阵 H 中的系数,对数据矩阵 X 应用有限脉冲响应滤波器。

 一、生成fir滤波器

fs = 600000;
f1 = 37.2;
f2 = 37.8;
wn = [f1 f2]*1000*2/fs;
b_BPF = fir1(32,wn);

二、生成信号

fs = 600000;
T = 2*10^-3;
N = round(T*fs);
t = (0:N-1)/fs;
sig = cos(2*pi*f0*1000*t);

三、MATLAB处理滤波

sig_filted = filter2(b_BPF,sig);

四、C语言处理滤波

int_sig = zeros(1,multi*N);
trans_sig = zeros(1,(multi*N+32));
for i = 1:N
   trans_sig((i-1)*multi+17) = sig(i);
end
for i = 17:N_N+16
    for j = 1:33
        int_sig(i-16) = int_sig(i-16) + trans_sig(i+j-17)*b_BPF(j);
    end
end

五、结果对比

  

PS:这两天做插值的时候被filter2用C实现困扰了,所以写一点经验,C语言是按照MATLAB写出来的,结果一致,但是跟C写差不多,等有时间再改。图和代码不对应,但结果是验证过了,最近实在太忙了~~~

MATLAB中的filter函数可以用于对信号进行滤波,它可以对一个一维向量或多维矩阵进行操作,可以实现多种类型的数字滤波器。在C语言中,我们可以使用差分方程来实现MATLABfilter函数的功能。 首先,我们需要明确MATLABfilter函数的输入参数和输出结果。filter函数的语法为:y = filter(b,a,x),其中b和a是滤波器的系数,x是待滤波信号函数返回值y是滤波后的信号。 在C语言中,我们可以使用差分方程来实现数字滤波器。假设我们有一个二阶低通滤波器,其传递函数为: H(z) = (b0 + b1*z^(-1) + b2*z^(-2)) / (1 + a1*z^(-1) + a2*z^(-2)) 其中,b0、b1、b2、a1、a2滤波器的系数,z是单位延迟。我们可以使用以下差分方程来实现该滤波器: y(n) = b0*x(n) + b1*x(n-1) + b2*x(n-2) - a1*y(n-1) - a2*y(n-2) 其中,x(n)和y(n)是输入信号和输出信号的第n个样本。 下面是一个C语言实现MATLAB filter函数的例子: ```c void filter(double *b, double *a, double *x, double *y, int N, int M) { int i, j; double tmp; double *buf = (double*)malloc((M+1)*sizeof(double)); for (i = 0; i <= M; i++) { buf[i] = 0; } for (i = 0; i < N; i++) { tmp = b[0]*x[i]; for (j = 1; j <= M; j++) { tmp += b[j]*x[i-j] - a[j]*buf[M-j]; } y[i] = tmp; for (j = M; j >= 1; j--) { buf[j] = buf[j-1]; } buf[0] = tmp; } free(buf); } ``` 在这个实现中,b和a分别是滤波器的系数,x是待滤波信号,y是滤波后的信号,N是信号的长度,M是滤波器的阶数。需要注意的是,M应该比b和a中系数的最大下标小1。 我们可以将该函数与一个测试代码一起使用,来验证其正确性: ```c int main() { double b[3] = {1, 2, 1}; double a[3] = {1, -0.5, 0.25}; double x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; double y[10]; int N = 10; int M = 2; int i; filter(b, a, x, y, N, M); for (i = 0; i < N; i++) { printf("%f ", y[i]); } printf("\n"); return 0; } ``` 该测试代码使用一个三点的低通滤波器对长度为10的信号进行滤波,并打印滤波后的结果。如果输出正确,则说明我们成功地实现了MATLABfilter函数的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值