日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现FIR滤波

發布時間:2023/12/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];//濾波器系數為階數+1double 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語言運行結果

總結

以上是生活随笔為你收集整理的C语言实现FIR滤波的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。