C语言实现FIR滤波

C语言实现FIR滤波

fir.c和fir.h见https://download.csdn.net/download/weixin_43216875/12010587

1 fir.h

#ifndef FIR_H
#define FIR_H

#include <math.h>

int max(int a,int b);
int min(int a, int b);
void conv(double *data_1,double *data_2, int length_1, int length_2, double *target);

double bessel0(double x);
double kaiser(int i , int n, double beta);
double window(int type, int n, int i, double beta);
void firwin(int n, int band, double fln, double fhn, int wn, double h[]);
/*
*  *n——整型变量。滤波器的阶数。
*  band——整型变量。滤波器的类型。取值为1、2、3和4,分别对应低通、高通、带通和带阻滤波器。
*  fln——双精度实型变量。
*  fhn——双精度实型变量。
*      对于低通和高通滤波器,fln:通带边界频率;对于带通和带阻滤波器,fIn:通带下边界频率,fhn:通带上边界频率
*  wn——整型变量。窗函数的类型;取值1到7,分别对应矩形窗,图基窗,三角窗,汉宁窗,海明窗,布拉克曼窗和凯塞窗。
*  h——双精度实型-~维数组,长度为(n+1).存放FIR滤波器的系数。
*      函数firwin()调用以下函数:子函数window(),窗函数的计算。子函数Kaiser(),凯塞窗的计算。子函数bessel0(),贝塞耳函数的计算。
*/
#endif // FIR_H

2 main.cpp

#include <iostream>
using namespace std;
#include <math.h>
#include "fir.h"

#define PI 3.1415926535897932384626433832795028841971
#define N 50000//与matlab中保持一致

int main()
{
    double signal[N];//原始数据
    double t[N];//时间序列
    double h[21];//滤波器系数为阶数+1
    double denoise[N+21-1];

    for(int i = 0; i<N ; i++)
        t[i] = i*static_cast<double>(5)/N;//时间序列0~5秒

    for(int i = 0; i<N ; i++)
        signal[i] = sin(2*PI*t[i]) + 0.5*sin(2*PI*1000*t[i]);

    firwin(20, 1, 1e-3, 1e-3, 5, h);
    /*
    *  20:阶数
    *  1:低通滤波
    *  1e-3:截止频率,与matlab中“5/Fs*2”相同
    *  5:海明窗
    */

    conv(h,signal,21,N,denoise);
    /*
   *  h:数据1
   *  signal:数据2
   *  21:数据1长度
   *  N:数据2长度
   *  denoise:卷积结果
    */

    FILE * fp;
    fp = fopen("F:/signal.txt","wb");
    for(int i=0;i<N;i++)
      fprintf(fp,"%lf\r\n",signal[i]);//将signal写入文本
    fclose(fp);

    fp = fopen("F:/denoise.txt","wb");
    for(int i=0;i<N+21-1;i++)
      fprintf(fp,"%lf\r\n",denoise[i]);//将denoise写入文本
    fclose(fp);

    return 0;
}

3 与Matlab对比

3.1 Matlab运行结果

Fs = 10000;%采样频域10kHz
N = 5*Fs;
t = 0:1/Fs:5;
signal = sin(2*pi*t)+0.5*sin(2*pi*1000*t);%2个不同频率的正弦信号叠加

subplot(2,1,1)
plot(t,signal);

b = fir1(20,5/Fs*2);
denoise = conv(b, signal);
denoise_fir = denoise(20/2+1:end-20/2);

subplot(2,1,2)
plot(t,denoise_fir);

3.2 C语言运行结果

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值