本文目錄一覽:
- 1、求:一個關於FIR帶通濾波器的C語言設計程序 代碼
- 2、c語言中butte函數是什麼意思
- 3、關於C語言中的函數調用問題,出現了以下錯誤,現貼出程序,請大家幫忙看一看,我是菜鳥….萬分感謝!
- 4、如何用C語言實現低通濾波器
求:一個關於FIR帶通濾波器的C語言設計程序 代碼
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語言中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是有兩個元素w1w2的向量, 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語言中的函數調用問題,出現了以下錯誤,現貼出程序,請大家幫忙看一看,我是菜鳥….萬分感謝!
懷疑你這段代碼是不是書上摘來的,連main()函數都沒有,修改了下代碼,上面四個錯誤不再出現了,你再把main()函數補上,應該可以運行了。
#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();//函數聲明
//double cosh1(),warp(),bpsub();omin();
void fblt();//函數聲明
fl=f2;
fh=f3;
for (k=0;kns;k++)
{
bwtf(2*ns,k,4,d,c); //求歸一化L階的每一階的分子、分母係數
fblt(d,c,n,fl,fh,b[k*(n+1)+0],a[k*(n+1)+0]); //計算出低通濾波器係數,然後轉化成為帶通係數
}
}
static void bwtf(ln,l,k,n,d,c) //求歸一化L階的每一階的分子、分母係數
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)//計算出低通濾波器係數,然後轉化成為帶通係數
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; //標示非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);//合併每個級的係數到一個大的傳遞函數係數集合
}
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);
}
如何用C語言實現低通濾波器
float middle_filter(float middle_value [] , intcount)
{
float sample_value, data;
int i, j;
for (i=1; i for(j=count-1; j=i,–j){
if(middle_value[j-1]=middle_value[j]{
data=middle_value[j-1];
middle_value[j-1]=middle_value[j]
middle_value[j]=data;
}
}
sample_value=middle_value(count-1)/2];
return(sample_value);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253882.html