matlab中实现《信号数字处理》中的滤波、褶积等功能

431 阅读3分钟

前言

对数字信号处理课程中的一些理论产生兴趣,通过Matlab进行一些实操,实现信号滤波的基本原理为傅立叶变换,对信号进行傅立叶变换后,则可得到频谱分布,依次便可进行滤波,包括高通、低通、带通等等。

基础函数

FFT(快速傅立叶变换)

IFFT(逆傅立叶变换)

X=FFT(x);
X=FFT(x,N);
x=IFFT(X);
x=IFFT(X,N);

功能实现

创建数个间歇波叠加形成的信号,通过滤波处理,并显示处理前后的图像。

低通滤波部分的实现

clc
clear
close all;

%input signal-------------------------
Fs =1000;
T=1/Fs;
L=1000;
t=(0:L-1)*T;
y=0.7*sin(2*pi*10*t)+2*sin(2*pi*120*t);
figure(1)
subplot(3,2,1);
plot(t,y)
grid on

%side ft----------------------------------
NFFT=L;
Y=fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
subplot(3,2,2);
plot(f,2*abs(Y(1:NFFT/2+1)));
grid on;

%low filter---------------------------
fn =1002;
fp=60;
fs =100;
Rp=2;
Rs=30
Wp=fp/(fn/2);
Ws=fs/(fn/2);
[n,Wn]=buttord(Wp,Ws,Rp,Rs);
[b,a]=butter(n,Wn);
[H,F]=freqz(b,a,NFFT/2+1,1002);
% subplot(3,3,3);
% plot(F,20*log10(abs(H)));
grid on;
% subplot(3,3,4);
pha=angle(H)*180/pi;
% plot(F,pha);
grid on;
A = 2*abs(Y(1:NFFT/2+1)).*(abs(H)');
subplot(3,2,3);
plot(f,A);
grid on;

% %ifft-------------------------------
for(i =1:L-(NFFT/2+1))
    A(1,((NFFT/2+1)+i))=A(1,((NFFT/2+1)-i));
end
z=A.*exp(1i*angle(Y));
z2=real(ifft(z));
subplot(3,2,4);
y=0.7*sin(2*pi*10*t);
plot(t,y);
axis([0,1,-2,2]);
% subplot(3,2,7);
% plot(t,z2*NFFT/2);

%high filter--------------------------
fn=1002;
fp=60;
fs=30;
Rp=3;
Rs=20;
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,NFFT/2+1,1002);
pha=angle(H)*180/pi;
A=(2*abs(Y(1:NFFT/2+1))).*(abs(H)');
subplot(3,2,5);
plot(f,A);
grid on;

%ifft-----------------------------
for i=1:L-(NFFT/2+1)
    A(1,((NFFT/2+1)+i))=A(1,((NFFT/2+1)-i));
end
z=A.*exp(1i*angle(Y));
z2=real(ifft(z));
subplot(3,2,6);
y = sin(2*pi*120*t);
plot(t,y);
axis([0,1,-2,2]);

di.jpg 带通部分的实现

clc
clear
close all

%????????
Fs = 1000; 
T=1/Fs;                  
L=1000;
t=(0:L-1)*T;             
y=0.7*cos(2*pi*100*t)+sin(2*pi*200*t)+0.4*sin(2*pi*40*t)+5*cos(2*pi*400*t); 
subplot(3,2,1)
plot(t,y)
grid on

NFFT=L;
Y=fft(y,NFFT)/L;             
f=Fs/2*linspace(0,1,NFFT/2+1);
subplot(3,2,2)
plot(f,2*abs(Y(1:NFFT/2+1)))  
xlabel('(Hz)')
ylabel('')
grid on


fn=1002;  
fp=[80,230];  
fs=[60,300];  
Rp=3;  
Rs=30;
Wp=fp/(fn/2);              
Ws=fs/(fn/2);
[n,Wn]=buttord(Wp,Ws,Rp,Rs);
[b,a]=butter(n,Wn);        

[H,F]=freqz(b,a,501,1002);


%plot(F,20*log10(abs(H)))
%axis([0 400 -30 3])
%xlabel('???? (Hz)'); ylabel('・ù??(dB)') 
%grid on
%subplot(3,2,3)
pha=angle(H)*180/pi;
% plot(F,pha)
% xlabel('???? (Hz)'); ylabel('?à??')
% grid on

%±???????????
A=2*abs(Y(1:NFFT/2+1)).*(abs(H)');
subplot(3,2,3)
plot(f,A)  
grid on

%×?ifft
for i=1:L-(NFFT/2+1)
A(1,((NFFT/2+1)+i))=A(1,((NFFT/2+1)-i));
end

z=A.*exp(1i*angle(Y));
z2=real(ifft(z));
subplot(3,2,4)
y=0.7*cos(2*pi*100*t)+sin(2*pi*200*t);
plot(t,y);
% subplot(3,2,5)
% plot(t,z2*NFFT/2);



%high filter---------------------------------
fn=1002;  
fp=[60,300]; 
fs=[70,250];  
Rp=3;  
Rs=30;
Ws=fs/(fn/2);
[n,Wn]=buttord(Wp,Ws,Rp,Rs);
[b,a]=butter(n,Wn,'stop');
[H,F]=freqz(b,a,501,1002);
subplot(3,2,5)
plot(F,20*log10(abs(H)))
axis([0 400 -35 3])
xlabel('???? (Hz)'); ylabel('・ù??(dB)')
grid on
%subplot(3,2,6)
pha=angle(H)*180/pi;
plot(F,pha)
xlabel('???? (Hz)'); ylabel('?à??')
grid on

%-------------------
A=(2*abs(Y(1:NFFT/2+1))).*(abs(H)');

%ifft-----------------------------------
for i=1:L-(NFFT/2+1)
A(1,((NFFT/2+1)+i))=A(1,((NFFT/2+1)-i));
end

z=A.*exp(1i*angle(Y));
z2=real(ifft(z));
%subplot(3,2,6)
y=0.4*sin(2*pi*40*t)+5*cos(2*pi*400*t);
plot(t,y);
subplot(2,1,2)
plot(t,z2*NFFT/2);

dai.jpg