当前位置:首页 » 编程语言 » 巴特沃斯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:48:54 浏览:427
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:552
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:738
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:531
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:141
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:227
java驼峰 发布:2025-02-02 09:13:26 浏览:646
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:527
linuxadobe 发布:2025-02-02 09:09:43 浏览:206
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:721