巴特沃斯濾波器c語言
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]='