滤波器代码
❶ 设计一个matlab带通滤波器代码
你自己整合吧,我没时间帮你整合,我给你提供一些程序:
绝对正确的代码:程序1:
fs=22050;
%语音信号采样频率为22050
x1=wavread('windows
critical
stop.wav');
%读取语音信号的数据,赋给变量x1
sound(x1,22050);
%播放语音信号
y1=fft(x1,1024);
%对信号做1024点fft变换
f=fs*(0:511)/1024;
figure(1)
plot(x1)
%做原始语音信号的时域图形
title('原始语音信号');
xlabel('time
n');
ylabel('fu
n');
figure(2)
freqz(x1)
%绘制原始语音信号的频率响应图
title('频率响应图')
figure(3)
subplot(2,1,1);
plot(abs(y1(1:512)))
%做原始语音信号的fft频谱图
title('原始语音信号fft频谱')
subplot(2,1,2);
plot(f,abs(y1(1:512)));
title('原始语音信号频谱')
xlabel('hz');
ylabel('fu');
程序2:
fs=22050;
%语音信号采样频率为22050
x1=wavread('windows
critical
stop.wav');
%读取语音信号的数据,赋给变量x1
t=0:1/22050:(size(x1)-1)/22050;
y1=fft(x1,1024);
%对信号做1024点fft变换
f=fs*(0:511)/1024;
x2=randn(1,length(x1));
%产生一与x长度一致的随机信号
sound(x2,22050);
figure(1)
plot(x2)
%做原始语音信号的时域图形
title('高斯随机噪声');
xlabel('time
n');
ylabel('fu
n');
randn('state',0);
m=randn(size(x1));
x2=0.1*m+x1;
sound(x2,22050);%播放加噪声后的语音信号
y2=fft(x2,1024);
figure(2)
plot(t,x2)
title('加噪后的语音信号');
xlabel('time
n');
ylabel('fu
n');
figure(3)
subplot(2,1,1);
plot(f,abs(y2(1:512)));
title('原始语音信号频谱');
xlabel('hz');
ylabel('fu');
subplot(2,1,2);
plot(f,abs(y2(1:512)));
title('加噪后的语音信号频谱');
xlabel('hz');
ylabel('fu');
根据以上代码,你可以修改下面有错误的代码
程序3:双线性变换法设计butterworth滤波器
fs=22050;
x1=wavread('h:\课程设计2\shuzi.wav');
t=0:1/22050:(size(x1)-1)/22050;
au=0.03;
d=[au*cos(2*pi*5000*t)]';
x2=x1+d;
wp=0.25*pi;
ws=0.3*pi;
rp=1;
rs=15;
fs=22050;
ts=1/fs;
wp1=2/ts*tan(wp/2);
%将模拟指标转换成数字指标
ws1=2/ts*tan(ws/2);
[n,wn]=buttord(wp1,ws1,rp,rs,'s');
%选择滤波器的最小阶数
[z,p,k]=buttap(n);
%创建butterworth模拟滤波器
[bap,aap]=zp2tf(z,p,k);
[b,a]=lp2lp(bap,aap,wn);
[bz,az]=bilinear(b,a,fs);
%用双线性变换法实现模拟滤波器到数字滤波器的转换
[h,w]=freqz(bz,az);
%绘制频率响应曲线
figure(1)
plot(w*fs/(2*pi),abs(h))
grid
xlabel('频率/hz')
ylabel('频率响应幅度')
title('butterworth')
f1=filter(bz,az,x2);
figure(2)
subplot(2,1,1)
plot(t,x2)
%画出滤波前的时域图
title('滤波前的时域波形');
subplot(2,1,2)
plot(t,f1);
%画出滤波后的时域图
title('滤波后的时域波形');
sound(f1,22050);
%播放滤波后的信号
f0=fft(f1,1024);
f=fs*(0:511)/1024;
figure(3)
y2=fft(x2,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512)));
%画出滤波前的频谱图
title('滤波前的频谱')
xlabel('hz');
ylabel('fu');
subplot(2,1,2)
f1=plot(f,abs(f0(1:512)));
%画出滤波后的频谱图
title('滤波后的频谱')
xlabel('hz');
ylabel('fu');
程序4:窗函数法设计滤波器:
fs=22050;
x1=wavread('h:\课程设计2\shuzi.wav');
t=0:1/22050:(size(x1)-1)/22050;
au=0.03;
d=[au*cos(2*pi*5000*t)]';
x2=x1+d;
wp=0.25*pi;
ws=0.3*pi;
wdelta=ws-wp;
n=ceil(6.6*pi/wdelta);
%取整
wn=(0.2+0.3)*pi/2;
b=fir1(n,wn/pi,hamming(n+1));
%选择窗函数,并归一化截止频率
figure(1)
freqz(b,1,512)
f2=filter(bz,az,x2)
figure(2)
subplot(2,1,1)
plot(t,x2)
title('滤波前的时域波形');
subplot(2,1,2)
plot(t,f2);
title('滤波后的时域波形');
sound(f2,22050);
%播放滤波后的语音信号
f0=fft(f2,1024);
f=fs*(0:511)/1024;
figure(3)
y2=fft(x2,1024);
subplot(2,1,1);
plot(f,abs(y2(1:512)));
title('滤波前的频谱')
xlabel('hz');
ylabel('fu');
subplot(2,1,2)
f2=plot(f,abs(f0(1:512)));
title('滤波后的频谱')
xlabel('hz');
ylabel('fu');
❷ 带通滤波器matlab代码
% 用切比雪夫最佳一致逼近设计线性相位FIR带通滤波器;
%信号为0.5hz, 0.9hz, 1.1hz和1.5hz的正统信号叠加组成
%通带为[0.9,1.1]
%频谱分辨率与信号实际长度N成正比
clear all;
f1=0.5;f2=0.9;f3=1.1;f4=1.5;t=0:1203;N=length(t);fs=10;M=512;
x1=sin(2*pi*(f1/fs)*t)+sin(2*pi*(f2/fs)*t)+sin(2*pi*(f3/fs)*t)+sin(2*pi*(f4/fs)*t);
figure(1);
subplot(211);plot(t,x1);title('原信号');
y=fft(x1);
f=(0:1/N:1/2-1/N)*fs;
subplot(212);plot(f,abs(y(1:N/2)));grid;xlabel('hz');%处理前频谱
wc1=2*f2/fs;wc2=2*f3/fs;wc3=2*f4/fs;%归一化角频率,用于下面的f1
f1=[0 wc1-0.05 wc1 wc2 wc2+0.05 1];
A=[0 0 1 1 0 0];%设置带通或带阻,1为带通,0为带阻
weigh=[1 1 1 ];%设置通带和阻带的权重
b=remez(60,f1,A,weigh);%传函分子
h1=freqz(b,1,M);%幅频特性
figure(2)
f=(0:1/M:1-1/M)*fs/2;
subplot(211);plot(f,abs(h1));grid;title('带通');
x2=filter(b,1,x1);
S1=fft(x2);
f=(0:1/N:1/2-1/N)*fs;
subplot(212);plot(f,abs(S1(1:N/2)));grid;xlabel('hz');%处理后频谱
❸ 数字切比雪夫滤波器MATLAB代码急求
用Matlab设计切比雪夫滤波器是很简单的,比如设计I型的
N = 8;%阶数
wp=0.2;%归一化截止频率
Rp= 1;%通带波纹
[b a]=cheby1(N,Rp,wp,'low');%设计低通滤波器
freqz(b,a)%频率响应曲线
❹ 一段matlab低通滤波器程序,求改编成C语言。
这个我刚好做过一个滤波器,事实上对时域信号做FFT,截取一定点数再做逆FFT相当于理想滤波。设计滤波器代码如下:
f1=100;f2=200;%待滤波正弦信号频率
fs=2000;%采样频率
m=(0.3*f1)/(fs/2);%定义过度带宽
M=round(8/m);%定义窗函数的长度
N=M-1;%定义滤波器的阶数
b=fir1(N,f2/fs);%使用fir1函数设计滤波器
%输入的参数分别是滤波器的阶数和截止频率
figure(1)
[h,f]=freqz(b,1,512);%滤波器的幅频特性图
%[H,W]=freqz(B,A,N)当N是一个整数时函数返回N点的频率向量和幅频响应向量
plot(f*fs/(2*pi),20*log10(abs(h)))%参数分别是频率与幅值
xlabel('频率/赫兹');ylabel('增益/分贝');title('滤波器的增益响应');
figure(2)
subplot(211)
t=0:1/fs:0.5;%定义时间范围和步长
s=sin(2*pi*f1*t)+sin(2*pi*f2*t);%滤波前信号
plot(t,s);%滤波前的信号图像
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
subplot(212)
Fs=fft(s,512);%将信号变换到频域
AFs=abs(Fs);%信号频域图的幅值
f=(0:255)*fs/512;%频率采样
plot(f,AFs(1:256));%滤波前的信号频域图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
figure(3)
sf=filter(b,1,s);%使用filter函数对信号进行滤波
%参数分别为滤波器系统函数的分子和分母多项式系数向量和待滤波信号输入
subplot(211)
plot(t,sf)%滤波后的信号图像
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
axis([0.2 0.5 -2 2]);%限定图像坐标范围
subplot(212)
Fsf=fft(sf,512);%滤波后的信号频域图
AFsf=abs(Fsf);%信号频域图的幅值
f=(0:255)*fs/512;%频率采样
plot(f,AFsf(1:256))%滤波后的信号频域图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');
❺ 求:一个关于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;
}
}
❻ 滤波器matlab代码
貌似此类专家很少哦~~~无解
❼ MATLAB基于汉宁窗的FIR的低通滤波器的源代码及注释
很常见的设计题目
给你一个例程,只需要改一改参数就行了
clear all;
f=[0 0.19 0.2 0.3 0.31 0.59 0.6 0.8 0.81 1];
% 给定频率轴分点;
m=[0 0 1 1 0 0 1 1 0 0];
% 给定在这些频率分点上理想的幅频响应
N1=30;
N2=90;
% 取两种不同的滤波器长度;
b1=fir2(N1,f,m);
b2=fir2(N2,f,m);
% 得到两个滤波器;
subplot(311);
stem(b1,'.');grid;
subplot(312);
stem(b2,'.');grid;
M=128;
[h1,w]=freqz(b1,1,M,1);
[h2,w]=freqz(b2,1,M,1);
subplot(313);
plot(w,abs(h1),'b-',w,abs(h2),'g-');grid;
其中,f是归依化以后的频率 通过数字滤波器的采样频率算出来,根据通带和阻带算好f和m就行了
看一看help,这个函数应该有窗函数的选择 默认情况下是汉明窗
希望能够帮到你
❽ 帮忙编一个matlab的低通滤波器的程序
clc;clearall;
%归一化模拟切比雪夫I型低通滤波器的设计
Wp=2*pi*1000;Ws=2*pi*1500;rp=3;rs=30;%设计滤波器的参数
wp=1;ws=Ws/Wp;%频带变换得到归一化滤波器
[N,wc]=cheb1ord(wp,ws,rp,rs,'s');%计算滤波器阶数和3dB截止频率
[z,p,k]=cheb1ap(N,rp);%计算归一化滤波器的零极点
[b,a]=zp2tf(z,p,k);%计算归一化滤波器系统函数的系数
w0=0:0.05*pi:2*pi;
[h0,w0]=freqs(b,a,w0);%求频率响应
figure(1)
plot(w0,20*log10(abs(h0)),'k');
title('归一化模拟且比雪夫I型低通滤波器');
xlabel('频率f/Hz');ylabel('幅度/dB');grid;
%一般低通切比雪夫低通滤波器的设计
[B,A]=lp2lp(b,a,Wp);%将归一化滤波器转换为一般模拟滤波器
w1=0:2*pi*100:2*pi*30000;
[h1,w1]=freqs(B,A,w1);
figure(2)
plot(w1/(2*pi),20*log10(abs(h1)),'k');
title('一般模拟且比雪夫I型低通滤波器');
xlabel('频率f/Hz');ylabel('幅度/dB');grid;
%冲激响应不变法设计低通巴特沃斯数字滤波器
Fs=10000;%采样频率
Wp1=Wp/Fs;Ws1=Ws/Fs;
rp1=3;rs1=30;%设计滤波器的参数
[N1,Wn]=cheb1ord(Wp,Ws,rp1,rs1,'s')%计算滤波器阶数
[b1,a1]=cheby1(N1,rp1,Wn,'s');%样本AF的系数函数的分子分母系数
[bz,az]=impinvar(b1,a1,Fs);%冲激响应不变法从AF到DF变换
[C1,B1,A1]=dir2par(bz,az)%直接形式转换为并联型
w2=[Wp1,Ws1];%数字临界频率
[H,f]=freqz(bz,az);%绘制数字滤波器的幅频特性和相频特性
[db,mag,pha,grd,f]=freqz_m(bz,az);%扩展函数检验滤波器的其他特性
figure(3)
plot(f/pi,db,'k');
title('冲激响应不变法设计低通切比雪夫I型数字滤波器');
xlabel('角频率w/pi');ylabel('振幅/dB');
axis([0,0.35,-30,5]);grid;
%用设计好的滤波器对信号进滤波处理
figure(4)
f1=500;f2=4000;%输入信号的频率
N=100;%数据长度
dt=1/Fs;n=0:N-1;t=n*dt;%采样间隔和时间序列
x=sin(2*pi*f1*t)+0.5*cos(2*pi*f2*t);%输入信号
subplot(2,1,1),plot(t,x),title('输入信号');
y=filtfilt(bz,az,x);%用滤波器进行滤波处理
y1=filter(bz,az,x);%进行滤波处理
subplot(2,1,2),plot(t,y,t,y1,':'),title('输出信号');xlabel('时间/s');
legend('filtfilt','filter')%加图例
freqz_m.m文件
function[db,mag,pha,grd,w]=freqz_m(b,a)
[H,w]=freqz(b,a,1000,'whole');
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
grd=grpdelay(pha);
dir2par.m文件
function[C,B,A]=dir2par(b,a)
M=length(b);N=length(a);
[r1,p1,C]=resiez(b,a);
p=cplxpair(p1,10000000*eps);
I=cplxcomp(p1,p);
r=r1(I);
K=floor(N/2);B=zeros(K,2);A=zeros(K,3);
ifK*2==N;
fori=1:2:N-2
Brow=r(i:1:i+1,:);
Arow=p(i:1:i+1,:);
[Brow,Arow]=resiez(Brow,Arow,[]);
B(fix((i+1)/2),:)=real(Brow);
A(fix((i+1)/2),:)=real(Arow);
end
[Brow,Arow]=resiez(r(N-1),p(N-1),[]);
B(K,:)=[real(Brow)0];A(K,:)=[real(Arow)0];
else
fori=1:2:N-1
Brow=r(i:1:i+1,:);
Arow=p(i:1:i+1,:);
[Brow,Arow]=resiez(Brow,Arow,[]);
B(fix((i+1)/2),:)=real(Brow);
A(fix((i+1)/2),:)=real(Arow);
end
end
cplxcomp.m文件
functionI=cplxcomp(p1,p2)
I=[];
forj=1:1:length(p2)
fori=1:1:length(p1)
if(abs(p1(i)-p2(j))<0.0001)
I=[I,i];
end
end
end
I=I';
❾ 急,帮忙看一段关于滤波器的代码(2阶的低通数字滤波) 简要把关键点说一下就行了!
首先,使用temp=(float)(wave)/16384 将输入的整数数据转换成浮点的数据。
使用浮点格式的数据运算后,输出再使用 wave=(int)(temp*16384);转换成整数。
先处以16384,是为了防止溢出;运算之后必须还原的~~