首先理想滤波器是不可能实现的,只能尽可能逼近理想滤波器的特性,但是由于成本和技术的复杂性的限制,在实际设计中就允许通带和阻带中存在一定的误差,即通带不一定是完全水平的,阻带信号也不一定都衰减到零,在通带与阻带之间还有一定宽度的过渡带 这些要求决定了滤波器的复杂程度,一般来说要求波动越小,就越难实现,而且这些因素也是相互制约的,鱼和熊掌不可兼得, 比如通带平整就意味着过渡带宽,衰减缓慢, 要求过渡带窄通带波动就大等等,故需要综合考虑,合理选择
以选择窗口函数为例, 要熟悉各种窗口函数的特性,根据具体要求来选择
最小阻带衰减 过渡带带宽△w
矩形窗 209dB 092π/M
汉宁窗 439dB 311π/M
海明窗 545dB 332π/M
布莱克曼窗 753dB 556π/M
太模糊了,问题也不是很清楚。
如果单纯调用的话,直接在button->callback里面添加所需的函数;
axes(handlesaxes1) %指定‘tag’为‘axes1’的坐标轴
plot(x1,y1);
axes(handlesaxes2) %指定‘tag’为‘axes2’的坐标轴
plot(x2,y2);
。。。
这个x1 x2 y1 y2,你应该在程序中是传递过来的参数,或者是全局变量。
如果你一点都不懂,建议你买本MATLAB/GUI的书回去参考,很多基础的东西都有。
hd=sin(wdn)/(pin); % 理想冲激响应
w=hamming(N)'; % 海明窗
h=hdw; % 实际冲激响应
H=20log10(abs(fft(h,1024))); % 实际滤波器的幅频特性
HH=[H(513:1024) H(1:512)];
subplot(221),stem(nn,hd,'k');
xlabel('n');title('理想冲激响应');axis([-70 70 -01 03]);
subplot(222),stem(nn,w,'k');axis([-70 70 -01 12]);
title('海明窗');xlabel('n');
subplot(223),stem(nn,h,'k');
axis([-70 70 -01 03]);xlabel('n');title('实际冲激响应');
w=(-512:511)/511;
subplot(224),plot(w,HH,'k');
axis([-12 12 -140 20]);xlabel('\omega/\pi');title('滤波器幅频特性');
set(gcf,'color','w');参考这段程序
从上面提示看,问题出在索引超过矩阵维数,可这样改:
L=length(x); %求信号长度 这句改为
L=length(X); 或改为:
L=min(length(X),length(Y))
上面这对代码分两部分:
1 %理想低通滤波器单位冲激响应函数
function hd=ideal_lp1(wc,N) % 这一行去掉分号
pha=angle(H);
2 % 主程序
clear all;
axis([0,1,-100,10])
其中1部分保存成一个叫ideal_lp1m的文件,放好别动;2部分保存成任意名字的m为文件,然后运行之。
常见的窗口有
矩形窗 boxcar()
三角窗 triang()
汉宁窗 hanning()
海明窗 hamming()
布拉克曼窗 blackman()
恺撒窗kaiser(n,beta)
绘制频率响应曲线有可以用freqz()函数,比如:
n=50;
figure; freqz(boxcar(n),1);
figure; freqz(hanning(n),1);
figure; freqz(hamming(n),1);
figure; freqz(blackman(n),1);
figure; freqz(kaiser(n,25),1);
或者直接用vwtool()工具,例如:
w = kaiser(200,25);
wvtool(w)
这是我刚做的双线性变换法低通滤波器,运行是正确的!ly是语音信号的名字,别的自己改改就行!
原语音信号程序
figure(1);
[y,fs,nbits]=wavread ('ly');
sound(y,fs,nbits); %回放语音信号
n = length (y) ; %求出语音信号的长度
Y=fft(y,n); %傅里叶变换
subplot(2,1,1);plot(y);title('原始信号波形');
subplot(2,1,2);plot(abs(Y));title('原始信号频谱')
加噪语音信号程序
figure(2);
[y,fs,nbits]=wavread ('ly');
n = length (y) ; %求出语音信号的长度
t=[0:1/8000:2 zeros(1,23520-1)]';
noise=004sin(10000pit);%sin函数产生噪声
s=y+noise; %语音信号加入噪声
sound(s);
subplot(2,1,1);plot(s);title('加噪语音信号的时域波形');
S=fft(s); %傅里叶变换
subplot(2,1,2);plot(abs(S));title('加噪语音信号的频域波形')
滤波后的信号程序
Ft=8000;
Fp=1000;
Fs=1200;
wp=2piFp/Ft;
ws=2piFs/Ft;
fp=2Fttan(wp/2);
fs=2Fstan(wp/2);
[n11,wn11]=buttord(wp,ws,1,50,'s'); %求低通滤波器的阶数和截止频率
[b11,a11]=butter(n11,wn11,'s'); %求S域的频率响应的参数
[num11,den11]=bilinear(b11,a11,05); %利用双线性变换实现频率响应S域到Z域的变换
[y,fs,nbits]=wavread ('ly');
n = length (y) ; %求出语音信号的长度
t=[0:1/8000:2 zeros(1,23520-1)]';
noise=004sin(10000pit);%sin函数产生噪声
s=y+noise; %语音信号加入噪声
z11=filter(num11,den11,s);
sound(z11);
m11=fft(z11); %求滤波后的信号
figure(3);
subplot(2,1,1);plot(z11);title('滤波后的信号波形');
subplot(2,1,2);plot(abs(m11),'r');title('滤波后信号的频谱');
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)