當前位置:首頁 » 編程語言 » 巴特沃斯濾波器c語言

巴特沃斯濾波器c語言

發布時間: 2022-07-16 13:12:02

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

設計濾波器只要完成這兩步就可以了,得到合適的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]

B. c語言中butte函數是什麼意思

C語言沒有這個函數
MATLAB中有這個函數

說明
巴特沃斯濾波器設計
語法
[z,p,k]=butter(n,Wn)
[z,p,k] = butter(n,Wn,'ftype')
[b,a]=butter(n,Wn)
[b,a]=butter(n,Wn,'ftype')
[A,B,C,D]=butter(n,Wn)
[A,B,C,D] = butter(n,Wn,'ftype')
[z,p,k]=butter(n,Wn,'s')
[z,p,k] = butter(n,Wn,'ftype','s')
[b,a]=butter(n,Wn,'s')
[b,a]=butter(n,Wn,'ftype','s')
[A,B,C,D]=butter(n,Wn,'s')
[A,B,C,D] = butter(n,Wn,'ftype','s')

描述
butter 用來設計低通、帶通、高通、和帶阻數字和模擬的巴特沃斯濾波器。巴特沃斯濾波器的特徵是通帶內幅度響應最大平坦,且整體上是單調的。
巴特沃斯濾波器犧牲了在通帶和阻帶內的單調衰減陡度。除非需要巴特沃斯濾波器的平滑性,橢圓或切比雪夫濾波器可以用更小的濾波器階數獲得更陡峭的衰減特性。

數字域
[z,p,k] = butter(n,Wn) 設計一個階數為n,歸一化截止頻率為Wn的低通數字巴特沃斯濾波器。此函數用n列的向量z和p返回零點和極點,以及用標量k返回增益。
[z,p,k] = butter(n,Wn,'ftype') 設計一個高通、低通或帶阻濾波器,字元串'ftype'取值是:
'high' 用於設計歸一化截止頻率為Wn的高通數字濾波器
'low' 用於設計歸一化截止頻率為Wn的低通數字濾波器
'stop' 用於設計階數為2*n的帶阻數字濾波器,Wn應該是有兩個元素的向量Wn=[w1 w2]。阻帶是w1 < ω <w2.
截止頻率 是幅度響應為處的的頻率。對巴特沃斯濾波器,歸一化截止頻率Wn必須是介於0和1之間的數,這里的1對應於尼奎斯特頻率,即每秒π弧度(π rad/s)。
如果Wn是含有兩個元素的向量,Wn=[w1 w2],butter 返回階數為 2*n的數字帶通濾波器,通頻帶為w1 < ω <w2.
通過返回不同數量的輸出參數,butter 直接地得到其它的濾波器實現。要獲得傳輸函數形式,使用如下所示的兩個輸出參數。

注意 參考下面的限制 了解關於影響形成傳輸函數的數值問題。
[b,a] = butter(n,Wn) 設計一個階為n,歸一化截止頻率為Wn的數字低通巴特沃斯濾波器。它返回濾波器系數在長度為n+1的行向量b和a中,這兩個向量包含z的降冪系數。

[b,a] = butter(n,Wn,'ftype') 設計一個高通、低通或帶阻濾波器,字元串'ftype' 是上面描述的'high'、'low'、或 'stop'。
要獲得狀態空間形式,使用下面所示的4個輸出參數:
[A,B,C,D] = butter(n,Wn) 或
[A,B,C,D] = butter(n,Wn,'ftype') 其中 A、 B,、C,、和D 是

並且u是輸入, x是狀態向量, y 是輸出。

模擬域
[z,p,k] = butter(n,Wn,'s') 設計一個階n,截止角頻率為Wn rad/s的模擬低通巴特沃斯濾波器。它返回零點和極點在長n或2*n的列向量z和p中,標量k返回增益。butter的截止角頻率Wn必須大於0 rad/s。
如果Wn是有兩個元素w1<w2的向量, butter(n,Wn,'s') 返回階 2*n 帶通模擬濾波器,其通帶是w1 < ω < w2。
[z,p,k] = butter(n,Wn,'ftype','s') 通過使用上面描述的ftype 值可以設計一個高通、低通或帶阻濾波器。
只要返回不同數量的輸出參數,butter 可以直接地獲得其它的模擬濾波器實現。要獲得傳輸函數形式,使用如下所示的兩個輸出參數:
[b,a] = butter(n,Wn,'s') 設計一個階n、截止角頻率為Wn rad/s的模擬低通巴特沃斯濾波器。它返回濾波器的系數在長n+1的行向量b和a中,這兩個向量包含下面這個傳輸函數中s的降冪系數:

[b,a] = butter(n,Wn,'ftype','s') 通過設置上面描述的ftype 值,可以設計一個高通、低通或帶阻濾波器。
要獲得狀態空間形式,使用下面的四個參數:
[A,B,C,D] = butter(n,Wn,'s') 或
[A,B,C,D] = butter(n,Wn,'ftype','s') 其中A、 B、 C、和D 是

並且u 作為輸入, x 是狀態向量, y 是輸出。
舉例
高通濾波器
對於1000Hz的采樣,設計一個9階高通巴特沃斯濾波器,截止頻率300Hz,相應的歸一化值為0.6:
[z,p,k] = butter(9,300/500,'high');
[sos,g] = zp2sos(z,p,k); % 轉換為二次分式表示形式
Hd = dfilt.df2tsos(sos,g); % 創建dfilt對象
h = fvtool(Hd); % 繪制幅度響應
set(h,'Analysis','freq') % 顯示頻率響應

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

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

D. 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;
}

E. 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;

}

F. 如何用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;
}
}

G. 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);
}

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

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很可能,我已經用盡了現有原始數據的所有潛能 新

I. 什麼是巴特沃斯濾波器

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

熱點內容
安卓動態壁紙怎麼提取 發布:2025-03-06 11:07:26 瀏覽:110
有鎖安卓手機有什麼壞處 發布:2025-03-06 11:00:20 瀏覽:575
dvwa上傳 發布:2025-03-06 10:46:58 瀏覽:699
新款榮放低配有哪些新配置 發布:2025-03-06 10:41:29 瀏覽:791
如何給文件上加密 發布:2025-03-06 10:33:09 瀏覽:371
python類super 發布:2025-03-06 10:32:16 瀏覽:74
編程代碼構成 發布:2025-03-06 10:23:58 瀏覽:955
如何看一台電視配置 發布:2025-03-06 10:18:08 瀏覽:253
如何查筆記本電腦配置 發布:2025-03-06 10:17:29 瀏覽:744
安卓手機消息彈幕怎麼設置 發布:2025-03-06 10:10:22 瀏覽:186