當前位置:首頁 » 編程語言 » 巴特沃斯c語言實現

巴特沃斯c語言實現

發布時間: 2022-07-13 12:43:19

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;

}

㈡ 聯系matlab用雙線性變換法設計Butterworth低通濾波器m

%下面程序可能對你有用,需根據你的指標修改一下前5行相關參數就行,至於最後顯示部分,相應變化一下即可。
%1.用Butterworth低通模擬濾波器原型%%%%%%%%%%%%%%%%%%%%%%%%%%%%數字濾波器指標
Wp=0.3*pi; %通帶邊界頻率(歸一化):wp=fp*2*pi/fs
Ws=0.5*pi; %阻帶邊界頻率(歸一化):ws=fr*2*pi/fs
Rp=0.5; %通帶波紋
As=40; %阻帶衰減
%轉換為模擬濾波器指標(預畸);
Ts=0.000125;fs=8000;
OmegaP=(2/Ts)*tan(Wp/2); %模擬低通原型濾波器通帶頻率
OmegaS=(2/Ts)*tan(Ws/2); %模擬低通原型濾波器阻帶頻率

[N,OmegaC]=buttord(OmegaP,OmegaS,Rp,As,'s'); %模擬巴特沃斯濾波器的階數和-3dB截止頻率計算,這時要加字元's'。
[z0,p0,k0]=buttap(N); %設計歸一化巴特沃茲濾波器低通原型
%進行非歸一化處理
p=p0*OmegaC; z=z0*OmegaC;
k=k0*OmegaC^N;
ba=k*real(poly(z));
aa=real(poly(p));

[bd,ad]=bilinear(ba,aa,fs); %雙線性變換
[h,w]=freqz(bd,ad); %計算頻率響應
am=20*log10(abs(h));
ph=angle(h);
%繪圖
subplot(2,1,1);plot(w/pi,am);
axis([0 1 -250 5]);
xlabel('w(以pi為單位)');ylabel('|H(ejw)|以dB為單位');
set(gca,'XTickMode','manual','XTick',[0 0.3 0.5 1]);
set(gca,'YTickMode','manual','YTick',[ -40 0]);grid;
subplot(2,1,2);plot(w/pi,ph/pi);xlabel('w(以pi為單位)');ylabel('相位以pi為單位');

㈢ 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') % 顯示頻率響應

㈣ 求幫助編寫一個六階巴特沃斯低通濾波器,截止頻率為35HZ,采樣頻率為100HZ,求matlab的此程序啊,

/*6thOrderLowPassButterworth */

/* */

/*SampleFrequency=100.0Hz */

/*StandardForm */

/*ArithmeticPrecision=4Digits */

/* */

/*PassBandFrequency=35.00Hz */

/* */

/******************************************************************************/

/* */

/*InputVariableDefinitions: */

/*Inputs: */

/* invar float Theinputtothefilter */

/* initvar float Theinitialvalueofthefilter */

/* setic int */

/* */

/*. */

/* */

floatDigFil(invar,initval,setic)

floatinvar,initval;intsetic;

{

floatsumnum,sumden; inti;

staticfloatdelay[7]={0.0,0.0,0.0,0.0,0.0,0.0,0.0};

staticfloatznum[7]={

.1477,

.8864,

2.216,

2.955,

2.216,

.8864,

.1477

};

staticfloatzden[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;

returninitval;

}

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];

returnsumnum;

}

}

matlab的沒有,不過你可以將其C語言轉換成Matlab的模擬一下!

㈤ C++實現巴特沃斯(Butterworth)帶通濾波器

65435

㈥ 請問如何對一列數據實現巴特沃斯過濾 要求C語言實現

這很難寫清楚,大概過程是:
將濾波器按照延時單元寫成差分方程的形式

用matlab計算出差分方程系數,即a,b

然後寫出差分方程即 y(n)與x(n)、x(n-1)、y(n-1)。。。。的關系

然後迭代計算y(n)即可

㈦ 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);
}

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

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

㈨ 有matlab實現一個巴特沃斯濾波器

>> %%生成50hz和100hz疊加的正弦波
Fs=1000;
T=1/Fs;
L=200;
t=(0:L-1)*T;
y1=sin(2*pi*50*t);
y2=sin(2*pi*100*t);
y=y1+y2+randn(size(t));
subplot(5,1,1);
plot(t,y);
%%快速傅里葉變換
N=2^nextpow2(L);
Y=fft(y,N)/L;
f=Fs/2*linspace(0,1,N/2+1);
subplot(5,1,2);
plot(f,2*abs(Y(1:N/2+1)));
%%濾波器的設計 wp通帶截止頻率 ws阻帶截止頻率 rp通帶最大衰減 as阻帶最小衰減
%%濾掉100hz的信號
wp=2*50/Fs;
ws=2*80/Fs;
rp=1;
as=30;
[N,wc]=buttord(wp,ws,rp,as);
[b,a]=butter(N,wc);
[H,w]=freqz(b,a);
z=filter(b,a,y);
subplot(5,1,3);
plot(w,abs(H));
subplot(5,1,4);
plot(t,z);
%%對濾波後得到的正弦波進行快速傅里葉變換
N1=2^nextpow2(L);
Y1=fft(z,N1)/L;
f1=Fs/2*linspace(0,1,N1/2+1);
subplot(5,1,5);
plot(f1,2*abs(Y1(1:N1/2+1)));
>> %%生成50hz和100hz疊加的正弦波
Fs=1000;
T=1/Fs;
L=200;
t=(0:L-1)*T;
y1=sin(2*pi*50*t);
y2=sin(2*pi*100*t);
y=y1+y2+randn(size(t));
subplot(5,1,1);
plot(t,y);
%%快速傅里葉變換
N=2^nextpow2(L);
Y=fft(y,N)/L;
f=Fs/2*linspace(0,1,N/2+1);
subplot(5,1,2);
plot(f,2*abs(Y(1:N/2+1)));
%%濾波器的設計 wp通帶截止頻率 ws阻帶截止頻率 rp通帶最大衰減 as阻帶最小衰減
%%濾掉100hz的信號
wp=2*50/Fs;
ws=2*80/Fs;
rp=1;
as=10;
[N,wc]=buttord(wp,ws,rp,as);
[b,a]=butter(N,wc);
[H,w]=freqz(b,a);
z=filter(b,a,y);
subplot(5,1,3);
plot(w,abs(H));
subplot(5,1,4);
plot(t,z);
%%對濾波後得到的正弦波進行快速傅里葉變換
N1=2^nextpow2(L);
Y1=fft(z,N1)/L;
f1=Fs/2*linspace(0,1,N1/2+1);
subplot(5,1,5);
plot(f1,2*abs(Y1(1:N1/2+1)));
>> %%生成50hz和100hz疊加的正弦波
Fs=1000;
T=1/Fs;
L=200;
t=(0:L-1)*T;
y1=sin(2*pi*50*t);
y2=sin(2*pi*100*t);
y=y1+y2+randn(size(t));
subplot(5,1,1);
plot(t,y);
%%快速傅里葉變換
N=2^nextpow2(L);
Y=fft(y,N)/L;
f=Fs/2*linspace(0,1,N/2+1);
subplot(5,1,2);
plot(f,2*abs(Y(1:N/2+1)));
%%濾波器的設計 wp通帶截止頻率 ws阻帶截止頻率 rp通帶最大衰減 as阻帶最小衰減
%%濾掉100hz的信號
wp=2*50/Fs;
ws=2*80/Fs;
rp=1;
as=50;
[N,wc]=buttord(wp,ws,rp,as);
[b,a]=butter(N,wc);
[H,w]=freqz(b,a);
z=filter(b,a,y);
subplot(5,1,3);
plot(w,abs(H));
subplot(5,1,4);
plot(t,z);
%%對濾波後得到的正弦波進行快速傅里葉變換
N1=2^nextpow2(L);
Y1=fft(z,N1)/L;
f1=Fs/2*linspace(0,1,N1/2+1);
subplot(5,1,5);
plot(f1,2*abs(Y1(1:N1/2+1)));
>>
>> %%生成50hz和100hz疊加的正弦波
Fs=1000;
T=1/Fs;
L=200;
t=(0:L-1)*T;
y1=sin(2*pi*50*t);
y2=sin(2*pi*100*t);
y=y1+y2+randn(size(t));
subplot(5,1,1);
plot(t,y);
%%快速傅里葉變換
N=2^nextpow2(L);
Y=fft(y,N)/L;
f=Fs/2*linspace(0,1,N/2+1);
subplot(5,1,2);
plot(f,2*abs(Y(1:N/2+1)));
%%濾波器的設計 wp通帶截止頻率 ws阻帶截止頻率 rp通帶最大衰減 as阻帶最小衰減
%%濾掉100hz的信號
wp=2*50/Fs;
ws=2*80/Fs;
rp=1;
as=10;
[N,wc]=buttord(wp,ws,rp,as);
[b,a]=butter(N,wc);
[H,w]=freqz(b,a);
z=filter(b,a,y);
subplot(5,1,3);
plot(w,abs(H));
subplot(5,1,4);
plot(t,z);
%%對濾波後得到的正弦波進行快速傅里葉變換
N1=2^nextpow2(L);
Y1=fft(z,N1)/L;
f1=Fs/2*linspace(0,1,N1/2+1);
subplot(5,1,5);
plot(f1,2*abs(Y1(1:N1/2+1)));
>>

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

熱點內容
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:529
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:139
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:225
java駝峰 發布:2025-02-02 09:13:26 瀏覽:644
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:526
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:205
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:720
加密狗硬體克隆 發布:2025-02-02 08:59:16 瀏覽:462
simulink編譯後沒有代碼 發布:2025-02-02 08:59:16 瀏覽:691
c不支持的存儲類別 發布:2025-02-02 08:55:05 瀏覽:104