short h[], short y[])
創(chuàng)新互聯(lián)公司專(zhuān)注于敖漢網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供敖漢營(yíng)銷(xiāo)型網(wǎng)站建設(shè),敖漢網(wǎng)站制作、敖漢網(wǎng)頁(yè)設(shè)計(jì)、敖漢網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開(kāi)發(fā)服務(wù),打造敖漢網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供敖漢網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
{
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;
}
}
shorth[],shorty[]){inti,j,sum;for(j=0;j15;}}2voidfir(shortx[],shorth[],shorty[]){inti,j,sum0,sum1;shortx0,x1,h0,h1;for(j=0;j15;y[j+1]=sum115;}}3voidfir(shortx[],shorth[],shorty[]){inti,j,sum0,sum1;shortx0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7;for(j=0;j15;y[j+1]=sum115;}}
C語(yǔ)言沒(méi)有這個(gè)函數(shù)
MATLAB中有這個(gè)函數(shù)
說(shuō)明
巴特沃斯濾波器設(shè)計(jì)
語(yǔ)法
[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 用來(lái)設(shè)計(jì)低通、帶通、高通、和帶阻數(shù)字和模擬的巴特沃斯濾波器。巴特沃斯濾波器的特征是通帶內(nèi)幅度響應(yīng)最大平坦,且整體上是單調(diào)的。
巴特沃斯濾波器犧牲了在通帶和阻帶內(nèi)的單調(diào)衰減陡度。除非需要巴特沃斯濾波器的平滑性,橢圓或切比雪夫?yàn)V波器可以用更小的濾波器階數(shù)獲得更陡峭的衰減特性。
數(shù)字域
[z,p,k] = butter(n,Wn) 設(shè)計(jì)一個(gè)階數(shù)為n,歸一化截止頻率為Wn的低通數(shù)字巴特沃斯濾波器。此函數(shù)用n列的向量z和p返回零點(diǎn)和極點(diǎn),以及用標(biāo)量k返回增益。
[z,p,k] = butter(n,Wn,'ftype') 設(shè)計(jì)一個(gè)高通、低通或帶阻濾波器,字符串'ftype'取值是:
'high' 用于設(shè)計(jì)歸一化截止頻率為Wn的高通數(shù)字濾波器
'low' 用于設(shè)計(jì)歸一化截止頻率為Wn的低通數(shù)字濾波器
'stop' 用于設(shè)計(jì)階數(shù)為2*n的帶阻數(shù)字濾波器,Wn應(yīng)該是有兩個(gè)元素的向量Wn=[w1 w2]。阻帶是w1 ω w2.
截止頻率 是幅度響應(yīng)為處的的頻率。對(duì)巴特沃斯濾波器,歸一化截止頻率Wn必須是介于0和1之間的數(shù),這里的1對(duì)應(yīng)于尼奎斯特頻率,即每秒π弧度(π rad/s)。
如果Wn是含有兩個(gè)元素的向量,Wn=[w1 w2],butter 返回階數(shù)為 2*n的數(shù)字帶通濾波器,通頻帶為w1 ω w2.
通過(guò)返回不同數(shù)量的輸出參數(shù),butter 直接地得到其它的濾波器實(shí)現(xiàn)。要獲得傳輸函數(shù)形式,使用如下所示的兩個(gè)輸出參數(shù)。
注意 參考下面的限制 了解關(guān)于影響形成傳輸函數(shù)的數(shù)值問(wèn)題。
[b,a] = butter(n,Wn) 設(shè)計(jì)一個(gè)階為n,歸一化截止頻率為Wn的數(shù)字低通巴特沃斯濾波器。它返回濾波器系數(shù)在長(zhǎng)度為n+1的行向量b和a中,這兩個(gè)向量包含z的降冪系數(shù)。
[b,a] = butter(n,Wn,'ftype') 設(shè)計(jì)一個(gè)高通、低通或帶阻濾波器,字符串'ftype' 是上面描述的'high'、'low'、或 'stop'。
要獲得狀態(tài)空間形式,使用下面所示的4個(gè)輸出參數(shù):
[A,B,C,D] = butter(n,Wn) 或
[A,B,C,D] = butter(n,Wn,'ftype') 其中 A、 B,、C,、和D 是
并且u是輸入, x是狀態(tài)向量, y 是輸出。
模擬域
[z,p,k] = butter(n,Wn,'s') 設(shè)計(jì)一個(gè)階n,截止角頻率為Wn rad/s的模擬低通巴特沃斯濾波器。它返回零點(diǎn)和極點(diǎn)在長(zhǎng)n或2*n的列向量z和p中,標(biāo)量k返回增益。butter的截止角頻率Wn必須大于0 rad/s。
如果Wn是有兩個(gè)元素w1w2的向量, butter(n,Wn,'s') 返回階 2*n 帶通模擬濾波器,其通帶是w1 ω w2。
[z,p,k] = butter(n,Wn,'ftype','s') 通過(guò)使用上面描述的ftype 值可以設(shè)計(jì)一個(gè)高通、低通或帶阻濾波器。
只要返回不同數(shù)量的輸出參數(shù),butter 可以直接地獲得其它的模擬濾波器實(shí)現(xiàn)。要獲得傳輸函數(shù)形式,使用如下所示的兩個(gè)輸出參數(shù):
[b,a] = butter(n,Wn,'s') 設(shè)計(jì)一個(gè)階n、截止角頻率為Wn rad/s的模擬低通巴特沃斯濾波器。它返回濾波器的系數(shù)在長(zhǎng)n+1的行向量b和a中,這兩個(gè)向量包含下面這個(gè)傳輸函數(shù)中s的降冪系數(shù):
[b,a] = butter(n,Wn,'ftype','s') 通過(guò)設(shè)置上面描述的ftype 值,可以設(shè)計(jì)一個(gè)高通、低通或帶阻濾波器。
要獲得狀態(tài)空間形式,使用下面的四個(gè)參數(shù):
[A,B,C,D] = butter(n,Wn,'s') 或
[A,B,C,D] = butter(n,Wn,'ftype','s') 其中A、 B、 C、和D 是
并且u 作為輸入, x 是狀態(tài)向量, y 是輸出。
舉例
高通濾波器
對(duì)于1000Hz的采樣,設(shè)計(jì)一個(gè)9階高通巴特沃斯濾波器,截止頻率300Hz,相應(yīng)的歸一化值為0.6:
[z,p,k] = butter(9,300/500,'high');
[sos,g] = zp2sos(z,p,k); % 轉(zhuǎn)換為二次分式表示形式
Hd = dfilt.df2tsos(sos,g); % 創(chuàng)建dfilt對(duì)象
h = fvtool(Hd); % 繪制幅度響應(yīng)
set(h,'Analysis','freq') % 顯示頻率響應(yīng)
懷疑你這段代碼是不是書(shū)上摘來(lái)的,連main()函數(shù)都沒(méi)有,修改了下代碼,上面四個(gè)錯(cuò)誤不再出現(xiàn)了,你再把main()函數(shù)補(bǔ)上,應(yīng)該可以運(yùn)行了。
#include stdio.h
#include "math.h"
#include "stdlib.h"
void iirbcfpass(ns,n,f1,f2,f3,f4,db,b,a)
double b[],a[],f1,f2,f3,f4,db;
int ns,n;
{
int k;
double *d,*c;
double omega,lamda,esslon,fl,fh; //帶通不需要omega;lamda;warp();bpsub();omin(),cosh1()
void bwtf();//函數(shù)聲明
//double cosh1(),warp(),bpsub();omin();
void fblt();//函數(shù)聲明
fl=f2;
fh=f3;
for (k=0;kns;k++)
{
bwtf(2*ns,k,4,d,c); //求歸一化L階的每一階的分子、分母系數(shù)
fblt(d,c,n,fl,fh,b[k*(n+1)+0],a[k*(n+1)+0]); //計(jì)算出低通濾波器系數(shù),然后轉(zhuǎn)化成為帶通系數(shù)
}
}
static void bwtf(ln,l,k,n,d,c) //求歸一化L階的每一階的分子、分母系數(shù)
int ln,k,n;
double d[],c[];
{
int i;
double pi,tmp;
pi=4.0*atan(1.0);
d[0]=1.0;
c[0]=1.0;
for (i=1;in;i++)
{
d[i]=0.0;
c[i]=0.0;
}
tmp=(k+1)-(ln+1.0)/2.0;
if (tmp==0.0)
{
c[1]=1.0;
}
else
{
c[1]=-2.0*cos((2*(k+1)+ln-1)*pi/(2*ln));
c[2]=1.0;
}
}
static void fblt(d,c,n,fln,fhn,b,a)//計(jì)算出低通濾波器系數(shù),然后轉(zhuǎn)化成為帶通系數(shù)
int n;
double fln,fhn,d[],c[],b[],a[];
{
int i,k,m,n1,n2,ls;
double pi,w,w0,w1,w2,tmp,tmpd,tmpc,*work;
double combin();
void bilinear();
pi=4.0*atan(1.0);
w1=tan(pi*fln);
for (i=n;i=0 ;i-- )
{
if(c[i]!=0.0 || (d[i]!=0.0))
break;
}
m=i; //標(biāo)示非0值的位置
n2=2*m;
n1=n2+1;
work=malloc(n1*n1*sizeof(double));
w2=tan(pi*fhn);
w=w2-w1;
w0=w1*w2;
for (i=0;i=n2 ;i++ )
{
work[0*n1+i]=0.0; //小心1與l
work[1*n1+i]=0.0;
}
for (i=0;i=m ;i++ )
{
tmpd=d[i]*pow(w,(m-i));
tmpd=c[i]*pow(w,(m-i));
for (k=0;k=i ;k++ )
{
ls=m+i-2*k;
tmp=combin(i,i)/(combin(k,k)*combin(i-k,i-k));
work[0*n1+ls]+=tmpd*pow(w0,k)*tmp;
work[1*n1+ls]+=tmpc*pow(w0,k)*tmp;
}
}
for (i=0;i=n2 ;i++ )
{
d[i]=work[0*n1+i];
c[i]=work[1*n1+i];
}
free(work);
bilinear(d,c,b,a,n);//合并每個(gè)級(jí)的系數(shù)到一個(gè)大的傳遞函數(shù)系數(shù)集合
}
static double combin(i1,i2)
int i1,i2;
{
int i;
double s;
s=1.0;
if (i2==0) return(s);
for (i=i1;i(i1-i2) ;i-- )
{
s*=i;
}
return(s);
}
static void bilinear(d,c,b,a,n)
int n;
double d[],c[],b[],a[];
{
int i,j,n1;
double sum,atmp,scale,*temp;
n1=n+1;
temp=malloc(n1*n1*sizeof(double));
for (j=0;j=n ;j++ )
{
temp[j*n1+0]=1.0;
}
sum=1.0;
for (i=1;i=n;i++)
{
sum=sum*(double)(n-i-1)/(double)i;
temp[0*n1+i]=sum;
}
for (i=1;i=n ;i++ )
for (j=1;j=n ;j++ )
{
temp[j*n1+i]=temp[(j-1)*n1+i]-temp[j*n1+i-1]-temp[(j-1)*n1+i-1];
}
for (i=n;i=0 ;i-- )
{
b[i]=0.0;
atmp=0.0;
for (j=0;j=n ;j++ )
{
b[i]=b[i]+temp[j*n1+i]*d[j];
atmp=atmp+temp[j*n1+i]*c[j];
}
scale=atmp;
if (i!=0)
{
a[i]=atmp;
}
}
for (i=0;i=n ;i++ )
{
b[i]=b[i]/scale;
a[i]=a[i]/scale;
}
a[0]=1.0;
free(temp);
}