當前位置:首頁 » 編程語言 » 5階巴特沃斯濾波器c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

5階巴特沃斯濾波器c語言

發布時間: 2022-08-19 10:33:26

① 巴特沃斯濾波器

不是,巴特沃斯濾波器是一種典型的模擬原型濾波器,可以作為設計其它模擬、數字濾波器的原型。巴特濾波器本身的傳遞函數,你可以預先通過查表得到各階的傳遞函數,但是裡面的參數還不能確定,這要綜合你所設計的濾波器的技術指標。
打個比方,你設計一個巴特沃斯低通濾波器的話,要有通帶截止頻率、阻帶頻率,用這2個指標去確定傳遞函數的參數,再結合你所設計濾波器的階次才是完整的確定了參數的傳遞函數。
當然,上面舉的只是一個低通模擬濾波器的設計,其它類型設計,根據不同類型,設計方法有差別。你自己看下資料就是了

c語言設計巴特沃斯低通濾波器fp=9khz,fs=15khz,ap=1dB,as=70dB

能實行,c語言不能顯示圖像,但是你要懂得如何用c調用matlab,過程比較復雜,這個程序任何參數都可以用,不限制

#include<engine.h>

#include<math.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

doublecalcN(doublefp,doubleap,doublefs,doubleas)

{

doublei=pow(10,(as/10))-1;

doubletmp=ap/10;

doublej=pow(10,tmp)-1;

doublek=log10((i/j));

doublet=log10(fs/fp);

doubleN=0.5*k/t+1;

returnN;

};

intmain(void)

{

intfp,ap,fs,as;

printf("請輸入fp:");

scanf("%d",&fp);

printf("請輸入ap:");

scanf("%d",&ap);

printf("請輸入fs:");

scanf("%d",&fs);

printf("請輸入as:");

scanf("%d",&as);

intf=calcN(fp,ap,fs,as);

printf("N=%d ",f);

charlin[40];

char*str="N=";

lin[0]='';

charin[4];

itoa(f,in,10);

strcat(lin,str);

strcat(lin,in);

strcat(lin,";");

///////////////////////////////////////////////////////////

Engine*ep;

if(!(ep=engOpen(NULL)))

{

printf("openfailed!pleasetryagain ");

}

engSetVisible(ep,0);

//mxArray*xx=mxCreateDoubleMatrix(1,N,mxREAL);

//mxArray*yy=mxCreateDoubleMatrix(1,N,mxREAL);

//memcpy(mxGetPr(xx),N*sizeof(double));

//memcpy(mxGetPr(yy),N*sizeof(double));

//engPutVariable(ep,"xx",xx);

//engPutVariable(ep,"yy",yy);

engEvalString(ep,"n=0:0.01:2;");

engEvalString(ep,lin);

engEvalString(ep,"[z,p,k]=buttap(N);");

engEvalString(ep,"[b,a]=zp2tf(z,p,k);");

engEvalString(ep,"[H,w]=freqs(b,a,n);");

engEvalString(ep,"magH=(abs(H)).^2;");

engEvalString(ep,"plot(w,magH);");

engEvalString(ep,"axis([0201])");

engEvalString(ep,"xlabel('w/wc');");

engEvalString(ep,"ylabel('|H(jw)|^2');");

engEvalString(ep,"title('');");

engEvalString(ep,"grid;");

getchar();

//mxDestroyArray(xx);

//mxDestroyArray(yy);

//engClose(ep);

return0;

}

③ 如何用c語言實現截止頻率為200hz的巴特沃斯低通濾波器

/* 6th Order Low Pass Butterworth */
/* Bilinear Transformation with Prewarping */
/* Sample Frequency = 100.0 Hz */
/* Standard Form */
/* Arithmetic Precision = 4 Digits */
/* */
/* Pass Band Frequency = 35.00 Hz */
/* */
/******************************************************************************/
/* */
/* Input Variable Definitions: */
/* Inputs: */
/* invar float The input to the filter */
/* initvar float The initial value of the filter */
/* setic int 1 to initialize the filter to the value of initvar */
/* */
/* There is no requirement to ever initialize the filter. */
/* The default initialization is zero when the filter is first called */
float DigFil(invar, initval, setic)
float invar, initval; int setic;

{
float sumnum, sumden; int i;
static float delay[7] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0};
static float znum[7] = {
.1477,
.8864,
2.216,
2.955,
2.216,
.8864,
.1477
};
static float zden[6] = {
2.183e-02,
.2099,
.8779,
2.055,
2.91,
2.38
};
if (setic==1){
for (i=0;i<=6;i++) delay[i] = .1058*initval;
return initval;
}
else{
sumden=0.0;
sumnum=0.0;
for (i=0;i<=5;i++){
delay[i] = delay[i+1];
sumden += delay[i]*zden[i];
sumnum += delay[i]*znum[i];
}
delay[6] = invar-sumden;
sumnum += delay[6]*znum[6];
return sumnum;
}
}

④ C或C++實現BUTTERWORTH濾波器

///巴特沃斯濾波器,帶增益
MatBoostButterworthFilter(constint&row,constint&col,constfloat&cutoff,constint&n,constfloat&boost)const
{
assert(row>1&&col>1);
assert(cutoff>0&&cutoff<0.5);
assert(n>=1);

if(boost>=1)
{
return(1-1/boost)*(BHPF(row,col,cutoff,n))+1/boost;
}
else
{
return(1-boost)*BLPF(row,col,cutoff,n)+boost;
}
}
///巴特沃斯高通濾波器
MatCIllumNorm::BHPF(constint&row,constint&col,constfloat&cutoff,constint&n)
{
return1-BLPF(row,col,cutoff,n);
}

///巴特沃斯低通濾波器
/*
-0.5
nistheorderofthefilter,thehighernisthesharper

1
f=--------------------
2n
1.0+(w/cutoff)
*/
MatBLPF(constint&row,constint&col,constfloat&cutoff,constint&n)
{
assert(row>1&&col>1);
assert(cutoff>0&&cutoff<0.5);
assert(n>=1);

MatX=Mat::zeros(row,col,CV_32F);
MatY=Mat::zeros(row,col,CV_32F);

if(col%2)
{
intt=-(col-1)/2;

for(intj=0;j<col;j++)
{
for(inti=0;i<row;i++)
{

X.at<float>(i,j)=((float)t)/(col-1);
}
t++;
}
}
else
{
intt=-col/2;

for(intj=0;j<col;j++)
{
for(inti=0;i<row;i++)
{
X.at<float>(i,j)=((float)t)/col;
}
t++;
}
}


if(row%2)
{
intt=-(row-1)/2;

for(inti=0;i<row;i++)
{
for(intj=0;j<col;j++)
{
Y.at<float>(i,j)=((float)t)/(row-1);
}
t++;
}
}
else
{
intt=-row/2;

for(inti=0;i<row;i++)
{
for(intj=0;j<col;j++)
{
Y.at<float>(i,j)=((float)t)/row;
}
t++;
}
}


MatH=Mat::zeros(row,col,CV_32F);

///計算頻域的巴特沃斯分類器
for(inti=0;i<row;i++)
{
for(intj=0;j<col;j++)
{
floatx=X.at<float>(i,j);
floaty=Y.at<float>(i,j);
floatradius=sqrtf(x*x+y*y);

///1.0./(1.0+(radius./cutoff).^(2*n))
H.at<float>(i,j)=1.0/(1.0+std::pow(radius/cutoff,2*n));
}
}

///shift將中心點移到左上角
H=CenterShift(H);

returnH;
}

MatCenterShift(constMat&_src)
{
Matsrc=Mat_<float>(_src);
Matdst=Mat::zeros(src.rows,src.cols,src.type());

intN=src.rows;
intD=src.cols;

int*rowIndex=newint[N];
int*colIndex=newint[D];

memset(rowIndex,0,sizeof(rowIndex[0])*N);
memset(colIndex,0,sizeof(colIndex[0])*D);

///行順序
intbegin=N/2;
for(inti=0;i<N;i++)
{
rowIndex[i]=begin;
begin++;
if(begin>=N)
{
begin=0;
}
}

///列順序
begin=D/2;
for(inti=0;i<D;i++)
{
colIndex[i]=begin;
begin++;
if(begin>=D)
{
begin=0;
}
}

///重新排序
for(inti=0;i<N;i++)
{
for(intj=0;j<D;j++)
{
dst.at<float>(i,j)=src.at<float>(rowIndex[i],colIndex[j]);
}
}

///釋放
delete[]rowIndex;
delete[]colIndex;
rowIndex=NULL;
colIndex=NULL;

returndst;
}

⑤ 怎樣設計巴特沃斯帶通濾波器參數,以及主要參數

1. buttord (1)[N,wc]=buttord(wp,ws,αp,αs) 用於計算巴特沃斯數字濾波器的階數N和3dB截止頻率wc。 調用參數wp,ws分別為數字濾波器的通帶、阻帶截止頻率的歸一化值,要求:0≤wp≤1,0≤ws≤1。1表示數字頻率pi。 αp,αs分別為通帶最大衰減和組帶最小衰減(dB)。 當ws≤wp時,為高通濾波器; 當wp和ws為二元矢量時,為帶通或帶阻濾波器,這時wc也是二元向量。 N,wc作為butter函數的調用參數。 (2)[N,Ωc]=buttord(Ωp,Ωs,αp,αs,『s』) 用於計算巴特沃斯模擬濾波器的階數N和3dB截止頻率Ωc。 Ωp,Ωs,Ωc均為實際模擬角頻率。 說明:buttord函數使用阻帶指標計算3dB截止頻率,這樣阻帶會剛好滿足要求,而通帶會有富餘。 2.buttap(N) [z0,p0,k0]=buttap(N) 用於計算N階巴特沃斯歸一化(3dB截止頻率Ωc=1)模擬低通原型濾波器系統函數的零、極點和增益因子。 說明:如果要從零、極點模型得到系統函數的分子、分母多項式系數向量ba、aa,可調用 [B,A]=zp2tf(z0,p0,k0) 3.butter (1)[b,a]=butter(N,wc,『ftype』) 計算N階巴特沃斯數字濾波器系統函數分子、分母多項式的系數向量b、a。 調用參數N和wc分別為巴特沃斯數字濾波器的階數和3dB截止頻率的歸一化值(關於pi歸一化),一般是調用buttord(1)格式計算N和wc。 系數b、a是按照z-1的升冪排列。 (2)[B,A]=butter(N,Ωc,『ftype』,『s』) 計算巴特沃斯模擬濾波器系統函數的分子、分母多項式系數向量ba、aa。 調用參數N和Ωc分別為巴特沃斯模擬濾波器的階數和3dB截止頻率(實際角頻率),可調用buttord(2)格式計算N和Ωc。 系數B、A按s的正降冪排列。 tfype為濾波器的類型: ◇ftype=high時,高通;Ωc只有1個值。 ◇ftype=stop時,帶阻阻;此時Ωc=[Ωcl,Ωcu],分別為帶阻濾波器的通帶3dB下截止頻率和上截止頻率。 ◇ ftype預設時: 若Ωc只有1個值,則默認為低通; 若Ωc有2個值,則默認為帶通;其通帶頻率區間Ωcl < Ω < Ωcu。 注意:所設計的帶通和帶阻濾波器系統函數是2N階。因為帶通濾波器相當於N階低通濾波器與N階高通濾波器級聯。 相關文章: 數學思想及理論 均勻亂數 MDSC很可能,我已經用盡了現有原始數據的所有潛能 新

⑥ matlab設計巴特沃斯濾波器,這個分子和分母是什麼意思啊,如圖。怎麼通過系數設計成C語言

NUMERATOR 分子
DENOMINATOR 分母
意識是 分子和分母多項式系數
GAIN 增益
通過濾波器後 幅值的線性變換值
你的y(n)=b(i)*x(n-i)-a(k)*y(n-k)是差分方程,這里用多項式系數方程
要通過系數設計C語言
就把濾波器系數和采樣序列進行卷積
float IIR()
{
float fSum;
fSum=0.0;
for ( i=0;i<IIRNUMBER;i++ )
{
fSum+=(fXn[i]*fAn[i]);
fSum+=(fYn[i]*fBn[i]);
}
return(fSum);
}

⑦ 巴特沃斯數字高通濾波器

設計思路:用模擬濾波器原型設計法設計,然後經過頻率轉換變為相應的模擬濾波器,最後用雙線性變換法將其變為相應的數字濾波器。其程序和結果圖如下:N=5;Wn=250*2*pi; fs=1000/2;[z,p,k]=buttap(N); %模擬濾波器原型設計[Bap,Aap]=zp2tf(z,p,k);%零極點模型轉換為傳遞函數模型[b,a]=lp2hp(Bap,Aap,Wn); %頻率轉換 [bz,az]=bilinear(b,a,fs);%雙線性變換freqz(bz,az)

⑧ 巴特沃斯濾波器c語言實現

說的很對,濾波玩的就是增益(衰減)變化,不同的頻率,不同的增益(衰減)。稱幅頻曲線。
1、巴特奧斯濾波器的截止頻率指-3db通頻帶頻率,也就是在這個頻率以內保證暢通(通帶)。
2、另一個指標叫做阻帶,頻率大於此值能夠保證衰減大於某值

⑨ 就是關於巴特沃斯濾波器的程序的編寫....

設計濾波器只要完成這兩步就可以了,得到合適的b和a就算設計完了。
[N, Wn] = buttord(Wp, Ws, Rp, Rs);[b,a] = butter(N,Wn)

但是已知條件中的Wp和Ws是不能直接代入的,必需轉換
Wp=Wp*2/fs;Ws=Ws*2/fs;這就是所謂的歸一化。fs是信號的采樣頻率。如果題目中沒有給出,可以根據人聲特點取44100Hz。如果題目中給了,就用題目的采樣頻率。
Rp和Rs如果題目沒有給,可以自己指定。一般可選Rp=1,Rs=40

高通,和上面過程一樣

帶通,過程一樣,Wp=[1000 2000] Ws=[800 2500]