设计巴特沃斯滤波器实现高通滤波

首先在MATLAB上通过设计一个巴特沃斯滤波器来实现一个高通滤波器。

%设计一个巴特沃斯高通滤波器
%滤除一个300HZ的正弦信号
clear;
fn = 10000;%采样频率
fp = 900;%通带截止频率
fs = 600;%阻带截止频率
Rp = 2;%通带最大衰减
Rs = 20;%阻带最小衰减
figure(1);
Wp = fp/(fn/2);
Ws = fs/(fn/2);
[n,Wn] = buttord(Wp,Ws,Rp,Rs);
[b,a] = butter(n,Wn,'high');

[H,F] = freqz(b,a,900,10000);%数字滤波器的频率响应
subplot(211);
plot(F,20*log10(abs(H)))
axis([0 4000 -30 3]);

subplot(212);
pha = angle(H)*180/pi;
plot(F,pha);
% axis([0 8000 -200 200]);
grid on;
figure(2);
f1 = 2000;
f2 = 300;
t = 0:1/fn:1;
x = sin(2*pi*f1*t)+cos(2*pi*f2*t)/6;
y = filter(b,a,x);
subplot(211);
Y = fft(x);
n=0:length(x)-1;
plot(n,Y);
subplot(212);
Y1 = fft(y);
n=0:length(y)-1;
plot(n,Y1);
grid on;
figure(4);
plot(t,x);
subplot(111);
figure(5);
plot(t,y);
subplot(111);

结果如下:
滤波器的频率特性:
在这里插入图片描述
在600HZ时-20分贝
输入波形:
在这里插入图片描述
可以从幅度看出输入波形为sin+cos/6;
输出波形:
在这里插入图片描述
输入和输出的频谱:
在这里插入图片描述
观察滤波器【b,a】[b,a] = butter(n,Wn,‘high’);
a = 1 -4.67625140576819 9.64877723309598 -11.3207795685212 8.12672213051155 -3.55976931154069 0.879191790281082 -0.0942959539620253
b = 0.307076464013131 -2.14953524809191 6.44860574427574 -10.7476762404596 10.7476762404596 -6.44860574427574 2.14953524809191 -0.307076464013131
则系统函数 y(n)= 4.67625140576819y(n-1)-9.64877723309598y(n-2)…+0.0942959539620253y(n-7)+0.307076464013131x(n)-2.14953524809191x(n-1)…-0.307076464013131x(n-7)
所以通过这个编写CCS的代码:

#include"math.h"

#define IIRNUMBER 8
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF  10000
#define PI 3.1415926

float InputWave();
float IIR();

float fBn[IIRNUMBER]={0,4.67625140576819,-9.64877723309598,11.3207795685212,-8.12672213051155,3.55976931154069,-0.879191790281082,0.0942959539620253};
float fAn[IIRNUMBER]={0.307076464013131,-2.14953524809191,6.44860574427574,-10.7476762404596,10.7476762404596,-6.44860574427574,2.14953524809191,-0.307076464013131};
float fXn[IIRNUMBER]={ 0.0 };
float fYn[IIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;

main()
{
	nIn=0; nOut=0;
	fInput=fOutput=0;
	f2PI=2*PI;
	fSignal1=0.0;
	fSignal2=PI*0.1;//初始相位
	fStepSignal1=2*PI*300;
	fStepSignal2=2*PI*2000;
	while ( 1 )
	{
		fInput=InputWave();
		fIn[nIn]=fInput;
		nIn++; nIn%=256;
		fOutput=IIR();
		fYn[0]=fOutput;
		fOut[nOut]=fOutput;
		nOut++;				// break point
		if ( nOut>=256 )
		{
			nOut=0;		
		}
	}
}
/*生成采样率10000HZ,频率300HZ的正弦信号+1/6频率2000HZ的余弦信号*/
float InputWave()
{
	for ( i=IIRNUMBER-1;i>0;i-- )
	{
		fXn[i]=fXn[i-1];
		fYn[i]=fYn[i-1];
	}
	fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0;

	fSignal1+=fStepSignal1/SAMPLEF;
	if ( fSignal1>=f2PI )	fSignal1-=f2PI;
	fSignal2+=fStepSignal2/SAMPLEF;
	if ( fSignal2>=f2PI )	fSignal2-=f2PI;
	return(fXn[0]);
}
//求y(n)=4.676251y(n-1)+....++0.0942959y(n-7)+0.3070764x(n)+....-0.307076x(n-7)
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);
}


debug结果如下:
输入信号:
在这里插入图片描述
滤波后输出信号:
在这里插入图片描述
输入信号频谱:
在这里插入图片描述
输出信号频谱:
在这里插入图片描述

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 巴特沃斯低通和高通滤波是数字信号处理中广泛使用的两种滤波方法。它们可以在一定程度上降低噪声干扰,保留信号的特征。 在matlab中,自带函数可以方便地实现这两种滤波。其中,butter函数可以产生指定阶数的巴特沃斯滤波器,使用时需要指定滤波类型(高通或低通)、截止频率和阶数等参数。在实现高通滤波时,需要用到matlab内置的highpass函数。 例如,使用以下代码实现一个4阶巴特沃斯低通滤波,截止频率为50Hz: fs = 1000; %采样频率为1kHz fc = 50; %截止频率为50Hz order = 4; %滤波器阶数为4 [b,a] = butter(order,fc/(fs/2),'low'); %产生4阶低通滤波器系数 filtered_signal = filter(b,a,input_signal); %将输入信号input_signal进行滤波 这样,就完成了低通滤波的过程。高通滤波同理,只需要将butter函数中的'low'改为'high',并使用highpass函数进行滤波即可。 需要注意的是,该方法虽然可以实现滤波,但并不能完全取代工程设计中的理论分析和实际调试。在实际应用中,应该结合实际情况选择合适的滤波器类型、截止频率和阶数,以达到更好的滤波效果。 ### 回答2: 巴特沃斯低通和高通滤波是数字信号处理中常用的滤波器类型,可以在信号处理中用于提取感兴趣的频率成分或者抑制不想要的噪声。在Matlab中,可以使用butter函数来实现这两个滤波器。 使用butter函数进行巴特沃斯低通滤波的方法如下:首先指定滤波器的阶数和截止频率,然后使用butter函数生成系数,最后使用filter函数将信号输入滤波器进行滤波。例如,以下代码实现对信号x进行一阶5Hz的巴特沃斯低通滤波: ```matlab fs = 100; % 采样率 fc = 5; % 截止频率 n = 1; % 阶数 [b, a] = butter(n, fc/(fs/2), 'low'); % 低通巴特沃斯滤波器系数 y = filter(b, a, x); % 滤波后的信号 ``` 同样,使用butter函数进行巴特沃斯高通滤波的方法如下:指定阶数和截止频率,使用butter函数生成系数,最后使用filter函数进行滤波。例如,以下代码实现对信号x进行二阶10Hz的巴特沃斯高通滤波: ```matlab fs = 100; % 采样率 fc = 10; % 截止频率 n = 2; % 阶数 [b, a] = butter(n, fc/(fs/2), 'high'); % 高通巴特沃斯滤波器系数 y = filter(b, a, x); % 滤波后的信号 ``` ### 回答3: 巴特沃斯低通滤波和高通滤波是数字信号处理中常用的滤波算法。在MATLAB软件中,直接调用butter函数可以实现这两种滤波。butter函数的使用方法如下: [b,a]=butter(n,Wn,'ftype') 其中,n是滤波器的阶数,Wn是截止频率,ftype是滤波器类型,如果ftype为'low'则表示低通滤波,如果ftype为'high'则表示高通滤波。 比如,如果要使用巴特沃斯低通滤波器对一段原始信号进行滤波,可以先计算出阶数和截止频率,例如: fs=1000; %采样率 fc=50; %截止频率 [n,Wn]=buttord(2*fc/fs,7*fc/fs,3,40); %计算阶数和截止频率 [b,a]=butter(n,Wn,'low'); %计算巴特沃斯低通滤波器系数 将计算出来的b和a系数直接代入filtfilt函数中即可实现滤波,例如: input_signal=randn(1000,1); %生成随机信号 output_signal=filtfilt(b,a,input_signal); %进行滤波 同样的,如果要进行巴特沃斯高通滤波,则只需要将butter函数中的'low'改为'high'即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值