當前位置:首頁 » 編程語言 » c語言實現fir濾波器

c語言實現fir濾波器

發布時間: 2022-03-08 14:33:36

⑴ 求IIR及FIR數字濾波器的c語言實現。(VC++)

這個問題比較復雜,最近本人也在研究數字濾波,

結合圖片說一下

第一個圖是fir的流程圖,其中Z-1是延遲,是單個采樣時間1/fs

n階的fir濾波器就是選取最近的n+1個樣本,然後使他們各自乘以自己的濾波器系數即圖中的F(n),[一般其他書的表示是h(n)]

然後相加得到輸出的y(n)就是一個輸出點

,其中F(n)的得出需要根據采樣頻率和濾波器的通帶和阻帶來決定

其中為了改善旁瓣的幅值,一般在采樣後給樣本或者h(n)加窗,當然可以用「最佳方法」來做

得出h(n)大致方法是先將矩形窗進行DFT,得出h(n),然後對h(n)進行加窗得出h(k),然後將∑h(k)×x(n)=y(n),假如階數較多可以用傅里葉變換使時域變頻域後再將卷積相加,可以利用FFT來改進實時性,提升速度

上面就是fir濾波器的簡述

第二個圖片上傳不了,直接給鏈接

http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7&in=12708&cl=2&cm=1&sc=0&lm=-1&pn=0&rn=1&di=2607528304&ln=1054&fr=

圖中的Z-1是延時,iir濾波器也叫無限沖擊響應濾波器,是有反饋的,

圖中的是一階的,相對fir濾波器來說,iir濾波器可以用較低的階數來獲得較好的濾波特效。但是其相位特性較差。

鑒於實用性,還是建議樓主去圖書館借書看,網路不可能得到確實的方案,

樓主可以去借「數字信號處理」的書,國外的中譯本就有詳細介紹fir和iir以及fft還有其他變換,國內的dsp大都幾乎是dsp用戶手冊的中譯本,對上述問題都是很簡陋地帶過,不予置評。

本人推薦一本書在www.ouravr.com上面的dsp專欄有下載,40多M,叫DSP演算法、應用和設計,本人有這本實體書,寫的較好

⑵ C語言實現fir1函數

C語言實現FIR濾波,與Matlab結果一致,https://blog.csdn.net/weixin_43216875/article/details/10337

⑶ 用C語言(!!!不移位方式)實現FIR濾波器 程序盡量簡單,還有正確性

short h[], short y[])
{
int i, j, sum; for (j = 0; j < 100; j++) {
sum = 0;
for (i = 0; i < 32; i++)
sum += x[i+j] * h[i];
y[j] = sum >> 15;
}
}

2

void fir(short x[], short h[], short y[])
{
int i, j, sum0, sum1;
short x0,x1,h0,h1; for (j = 0; j < 100; j+=2) {
sum0 = 0;
sum1 = 0;
x0 = x[j];
for (i = 0; i < 32; i+=2){
x1 = x[j+i+1];
h0 = h[i];
sum0 += x0 * h0;
sum1 += x1 * h0;
x0 = x[j+i+2];
h1 = h[i+1];
sum0 += x1 * h1;
sum1 += x0 * h1;
}
y[j] = sum0 >> 15;
y[j+1] = sum1 >> 15;
}
}

3

void fir(short x[], short h[], short y[])
{
int i, j, sum0, sum1;
short x0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7; for (j = 0; j < 100; j+=2) {
sum0 = 0;
sum1 = 0;
x0 = x[j];
for (i = 0; i < 32; i+=8){
x1 = x[j+i+1];
h0 = h[i];
sum0 += x0 * h0;
sum1 += x1 * h0;
x2 = x[j+i+2];
h1 = h[i+1];
sum0 += x1 * h1;
sum1 += x2 * h1;
x3 = x[j+i+3];
h2 = h[i+2];
sum0 += x2 * h2;
sum1 += x3 * h2;
x4 = x[j+i+4];
h3 = h[i+3];
sum0 += x3 * h3;
sum1 += x4 * h3;
x5 = x[j+i+5];
h4 = h[i+4];
sum0 += x4 * h4;
sum1 += x5 * h4;
x6 = x[j+i+6];
h5 = h[i+5];
sum0 += x5 * h5;
sum1 += x6 * h5;
x7 = x[j+i+7];
h6 = h[i+6];
sum0 += x6 * h6;
sum1 += x7 * h6;
x0 = x[j+i+8];
h7 = h[i+7];
sum0 += x7 * h7;
sum1 += x0 * h7;
}
y[j] = sum0 >> 15;
y[j+1] = sum1 >> 15;
}
}

⑷ 求用C語言實現一個FIR數字低通濾波

沒有定義這個函數,此函數為
function hd=ideal_lp(wc,M);
%Ideal Lowpass filter computation
%------------------------------------
%[hd]=ideal_lp(wc,M)
% hd=ideal impulse response between 0 to M-1
% wc=cutoff frequency in radians
% M=length of the ideal filter
%
alpha=(M-1)/2;
n=[0:1:(M-1)];
m=n-alpha+eps;
hd=sin(wc*m)./(pi*m);
點擊file中的new中M-file,新建上面的函數,保存後就可以運行了
另外,團IDC網上有許多產品團購,便宜有口碑

⑸ 幫幫忙,能不能給我 基於C語言的FIR濾波器設計的程序代碼(包括CMD,C,ASM),謝謝了 真的很急!!!

#include"math.h"
void firwin(n,band,fln,fhn,wn,h)
int n,band,wn;
double fln,fhn,h[];
{int i,n2,mid;
double s,pi,wc1,wc2,beta,delay;
double window();
beta=0.0;
if(wn==7)
{printf("input beta parameter of Kaiser window(2<beta<10)\n");
scanf("%1f",&beta);
}
pi=4.0*atan(1.0);
if((n%2)==0)/*如果n是偶數*/
{n2=n/2+1;/*這行什麼意思*/
mid=1;
}
else
{n2=n/2;
mid=0;
}
delay=n/2.0;
wc1=2.0*pi*fln;
if(band>=3) wc2=2.0*pi*fhn;/*先判斷用戶輸入的數據,如果band參數大於3*/
switch(band)
{case 1:
{for(i=0;i<=n2;i++)
{s=i-delay;
h[i]=(sin(wc1*s)/(pi*s))*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1) h[n/2]=wc1/pi;
break;
}
case 2:
{for(i=0;i<=n2;i++)
{s=i-delay;
h[i]=(sin(pi*s)-sin(wc1*s))/(pi*s);
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1) h[n/2]=1.0-wc1/pi;
break;
}
case 3:
{for(i=0;i<n2;i++)
{s=i-delay;
h[i]=(sin(wc2*s)-sin(wc1*s))/(pi*s);
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1)h[n/2]=(wc2-wc1)/pi;
break;
}
case 4:
{for(i=0;i<=n2;i++)
{s=i-delay;
h[i]=(sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s);
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1)h[n/2]=(wc1+pi-wc2)/pi;
break;
}
}
}
static double window(type,n,i,beta)
int i,n,type;
double beta;
{int k;
double pi,w;
double kaiser();
pi=4.0*atan(1.0);
w=1.0;
switch(type)
{case 1:
{w=1.0;
break;
}
case 2:
{k=(n-2)/10;
if(i<=k)
w=0.5*(1.0-cos(i*pi/(k+1)));
break;
}
case 3:
{w=1.0-fabs(1.0-2*i/(n-1.0));
break;
}
case 4:
{w=0.5*(1.0-cos(2*i*pi/(n-1)));
break;
}
case 5:
{w=0.54-0.46*cos(2*i*pi/(n-1));
break;
}
case 6:
{w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));
break;
}
case 7:
{w=kaiser(i,n,beta);
break;
}
}
return(w);
}
static double kaiser(i,n,beta)
int i,n;
double beta;
{
double a,w,a2,b1,b2,beta1;
double bessel0();
b1=bessel0(beta);
a=2.0*i/(double)(n-1)-1.0;
a2=a*a;
beta1=beta*sqrt(1.0-a2);
b2=bessel0(beta1);
w=b2/b1;
return(w);
}
static double bessel0(x)
double x;
{int i;
double d,y,d2,sum;
y=x/2.0;
d=1.0;
sum=1.0;
for(i=1;i<=25;i++)
{d=d*y/i;
d2=d*d;
sum=sum+d2;
if(d2<sum*(1.0e-8)) break;
}
return(sum);
}
這是窗函數法的,當然還有其他的比如切比雪夫,零相位濾波什麼的,我也在研究,不是很懂哈

⑹ 430單片機C語言實現的FIR濾波器

去tichinese的網站看看有沒有吧

⑺ 如何用C語言來實現數字濾波器

用C語言實現,希望能給出個完整的已調試好程序,不甚感謝,給你20分問題補充:例子中9、2、14有誤,應該是11、2、14
太麻煩了
我只編了一

⑻ 各位好心人幫幫忙,誰能給我段基於c語言fir濾波器設計的程序代碼啊。急急急!!!!!

1

void fir(short x[], short h[], short y[])
{
int i, j, sum; for (j = 0; j < 100; j++) {
sum = 0;
for (i = 0; i < 32; i++)
sum += x[i+j] * h[i];
y[j] = sum >> 15;
}
}

2

void fir(short x[], short h[], short y[])
{
int i, j, sum0, sum1;
short x0,x1,h0,h1; for (j = 0; j < 100; j+=2) {
sum0 = 0;
sum1 = 0;
x0 = x[j];
for (i = 0; i < 32; i+=2){
x1 = x[j+i+1];
h0 = h[i];
sum0 += x0 * h0;
sum1 += x1 * h0;
x0 = x[j+i+2];
h1 = h[i+1];
sum0 += x1 * h1;
sum1 += x0 * h1;
}
y[j] = sum0 >> 15;
y[j+1] = sum1 >> 15;
}
}

3

void fir(short x[], short h[], short y[])
{
int i, j, sum0, sum1;
short x0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7; for (j = 0; j < 100; j+=2) {
sum0 = 0;
sum1 = 0;
x0 = x[j];
for (i = 0; i < 32; i+=8){
x1 = x[j+i+1];
h0 = h[i];
sum0 += x0 * h0;
sum1 += x1 * h0;
x2 = x[j+i+2];
h1 = h[i+1];
sum0 += x1 * h1;
sum1 += x2 * h1;
x3 = x[j+i+3];
h2 = h[i+2];
sum0 += x2 * h2;
sum1 += x3 * h2;
x4 = x[j+i+4];
h3 = h[i+3];
sum0 += x3 * h3;
sum1 += x4 * h3;
x5 = x[j+i+5];
h4 = h[i+4];
sum0 += x4 * h4;
sum1 += x5 * h4;
x6 = x[j+i+6];
h5 = h[i+5];
sum0 += x5 * h5;
sum1 += x6 * h5;
x7 = x[j+i+7];
h6 = h[i+6];
sum0 += x6 * h6;
sum1 += x7 * h6;
x0 = x[j+i+8];
h7 = h[i+7];
sum0 += x7 * h7;
sum1 += x0 * h7;
}
y[j] = sum0 >> 15;
y[j+1] = sum1 >> 15;
}
}

⑼ 求:一個關於FIR帶通濾波器的C語言設計程序 代碼

這兄弟可以用matlab做嗎?如果可以我給你寫代碼,很榮幸為您解答難題,竭誠為您服務,祝您開心,生活加油~~~

⑽ FIR濾波器的C語言程序

length==256

熱點內容
oicq伺服器地址 發布:2025-01-13 17:34:19 瀏覽:928
默認管理密碼是什麼 發布:2025-01-13 17:33:33 瀏覽:443
系列影視廣告文案腳本 發布:2025-01-13 17:31:57 瀏覽:792
防盜器編程 發布:2025-01-13 17:24:39 瀏覽:899
聯通電信伺服器怎麼不卡頓 發布:2025-01-13 17:21:30 瀏覽:821
科沃茲低配可以升級哪些配置 發布:2025-01-13 17:09:26 瀏覽:330
android判斷資料庫是否存在 發布:2025-01-13 17:08:17 瀏覽:334
ie腳本運行錯誤 發布:2025-01-13 17:08:05 瀏覽:623
python中或者怎麼表示 發布:2025-01-13 16:32:33 瀏覽:291
易達加密鎖 發布:2025-01-13 16:27:23 瀏覽:516