MATLAB实现一阶RC滤波器

MATLAB仿真分别实现一阶RC低通和高通滤波器,输入信号为正弦信号或者方波信号。

注意截止频率为f = 1/(2*pi*R*C)

低通滤波器下所示:

%功能:一阶RC低通滤波器仿真
%说明:
%1、分析了一阶RC滤波器的幅值衰减特性和相移特性
%2、分析了一阶RC滤波器的频域特性
%3、使用lsim对系统进行仿真
%4、使用FFT对原始输入信号和滤波器输出信号进行分析
%传递函数:sys=1/(1+sRC)
%==========================================================================
clc
clear 
close all
A=1;       % A 幅度值
fs=5000000; % fs 采样率//最后转化为频域的最远距离最大频率//采样的频率
F=10000;   % F 频率,小于采样率的一半(奈奎斯特)//信号频率

N=5000;   % N 采样个数//取了多少个点//
            %采样频率与采样个数没有什么必然关系,采样个数乘上采样频率的倒数(时间间隔)即为总的时间长度
dt=1/fs;    %时间间隔//决定了时间点与点之间的距离,当然随便指定一个数也行,只不过使信号的时域上的长度不同
t=0:dt:(N-1)*dt;    %时间向量
F1=1.0*10^3;
F2=5.0*10^3;
F3=8.0*10^3;

F4=25*10^3;
F5=45*10^3;
F6=65*10^3;

F7=100*10^3;
F8=300*10^3;
F9=400*10^3;
F10=15.9*1000;
%------------------------信源产生-------------------------------------------
dataSourceType=0;   %波形类型 0表示正弦波,1表示三角波,2表示方波
switch dataSourceType
    case 0
 %        y=A*sin(2*pi*F1*t);
   %       y=A*sin(2*pi*F2*t);
  %       y=A*sin(2*pi*F3*t);
  %       y=A*sin(2*pi*F4*t);
  %     y=A*sin(2*pi*F5*t);
  %       y=A*sin(2*pi*F6*t)
  %      y=A*sin(2*pi*F7*t);
  %      y=A*sin(2*pi*F8*t);
    %      y=A*sin(2*pi*F9*t);
         y=A*sin(2*pi*F10*t);

           
    case 1
        y=A*sawtooth(2*pi*F*t,0.5);   %三角波
    case 2
        y=A*square(2*pi*F*t,50);
        %方波
    otherwise
end
%--------------------画出原始输入信号的时域与频域图像----------------------
figure(1);
subplot(2,1,1);
plot(t,y);
title('信号的时域波形');%对原始图像进行时域画图
xlabel('时间/s');
ylabel('电压/v');
h=fft(y,5000);%快速傅里叶变换
h_d=abs(fftshift(h));%使频域图像中间为零
f=(-N/2:N/2-1)*fs/N;%将取得时间上的点转化为频率上的点
subplot(2,1,2);
plot(f,h_d/5000);%画原始图像频域上图
%axis([-4*10^4 4*10^4 0 1]);
title('信号的频域波形');
xlabel('频率/hz');
ylabel('电压/v');
%---------------------------滤波器部分------------------------------------
%-----------------------滤波器本身特性(波特图)----------------------------
r=10.2*10^3;%电阻阻值(ome)
c=((1200*5600)/(1200+5600))*10^(-12);%电容(f)
w=2*pi*f;%角频率
Para=r*c*1i;
for n=1:length(f)
   S(n)=abs(1/(1+Para*w(n)));%滤波器对于不同频率幅值衰减系数
   P(n)=angle(1/(1+Para*w(n)))*180/pi;%滤波器对于不同频率相移系数
end
figure(2);
subplot(2,1,1);
plot(f,S,'r');%幅值曲线
title('幅值衰减特性');
xlabel('频率/hz');
ylabel('增益倍数');
subplot(2,1,2);
plot(f,P,'blue');%相位曲线
title('相位特性');
xlabel('频率/hz');
ylabel('相位');
Func=tf(1,[r*c,1]);%系统的传递函数
figure(3);
bode(Func);%系统的波特图
title('幅频特性');
%--------------------信号通过滤波器----------------------------------
[yout,tout] = lsim(Func,y,t);%滤波后信号图像
%-----------------------时域图像------------------------------------
figure(4);
subplot(2,1,1);
plot(t,y);
title('原始信号');
xlabel('时间/s');
ylabel('电压/v');
subplot(2,1,2);
plot(tout,yout);
title('滤波后的时域波形');
xlabel('时间/s');
ylabel('电压/v');
%------------------------------频域图像---------------------------------
q=fft(yout);
q_d=abs(fftshift(q));
figure(5);
subplot(2,1,1);
plot(f,q_d);
title('滤波后的频谱');
xlabel('频率/hz');
ylabel('电压/v');
subplot(2,1,2);
plot(f,h_d);
title('输入信号的频谱');
xlabel('频率/hz');
ylabel('电压/v');
%-------------------------------功率谱------------------------------------
figure(6);
subplot(2,1,1);
youtpsd=q_d.*conj(q_d);
plot(f,youtpsd);
title('输出信号功率谱');
xlabel('频率/Hz');
ylabel('W/Hz');
subplot(2,1,2);
ypsd=h_d.*conj(h_d);
plot(f,ypsd);
title('输入信号功率谱');
xlabel('频率/Hz');
ylabel('W/Hz');
%-------------------------------自相关函数--------------------------------
figure(7)
subplot(2,1,1);
[Rx,maxlags]=xcorr(y,'unbiased');  %信号的自相关
if fs>10000  %调整时间轴单位及标签,便于观测波形
    plot(maxlags/fs*1000,Rx/max(Rx));
else
    plot(maxlags/fs,Rx/max(Rx));
end
title('输入信号自相关函数');
xlabel('时间/s');
ylabel('R(t)');
subplot(2,1,2);
[Rx1,maxlags1]=xcorr(yout,'unbiased');  %信号的自相关
if fs>10000  %调整时间轴单位及标签,便于观测波形
    plot(maxlags1/fs*1000,Rx1/max(Rx));
else
    plot(maxlags1/fs,Rx1/max(Rx));
end
title('输出信号自相关函数');
xlabel('时间/s');
ylabel('R(t)');

高通滤波器如下所示:

%功能:一阶RC滤波器仿真
%说明:
%1、分析了一阶RC滤波器的幅值衰减特性和相移特性
%2、分析了一阶RC滤波器的频域特性
%3、使用lsim对系统进行仿真
%4、使用FFT对原始输入信号和滤波器输出信号进行分析
%传递函数:sys=s/(s+1/RC)
%==========================================================================
close all;
clear all;


%%
%输入信号的产生
%输入信号产生
fs=5000000; % fs 采样率
F=10000;   % F 频率,小于采样率的一半(奈奎斯特)
A=1;       % A 幅度值
N=5000;   % N 采样个数
%采样频率与采样个数没有什么必然关系,采样个数乘上采样频率的倒数(时间间隔)即为总的时间长度
dt=1/fs;    %时间间隔
t=0:dt:(N-1)*dt;    %时间向量
freqPixel=fs/N;     %频率分辨率,即点与点之间频率单位
dataSourceType=2;   %波形类型 0表示正弦波,1表示双音正弦波,2表示方波
F1 = 20e+3;
F2 = 5e+3;
F3 = 25e+3;
switch dataSourceType
	case 0
		y=A*sin(2*pi*F1*t);	%频率为20khz正弦波
	case 1
		y=A*(sin(2*pi*F2*t)+sin(2*pi*F3*t) ); %频率为25khz和5khz双音正弦波
	case 2
		y=A*square(2*pi*F2*t,50);%频率为5KHz的方波
	otherwise
end
% Tlabel='时间/s';
% if fs>10000  %调整时间轴单位及标签,便于观测波形
%     t=t*1000;
%     Tlabel='时间/ms';
% end
figure(1);
subplot(2,1,1);
plot(t,y);
title('信号的时域波形');%对原始图像进行时域画图
xlabel('时间/s');
ylabel('电压/v');
h=fft(y,5000);%快速傅里叶变换
h_d=abs(fftshift(h));%使频域图像中间为零
f=(-N/2:N/2-1)*fs/N;%将取得时间上的点转化为频率上的点
subplot(2,1,2);
plot(f,h_d/5000);%画原始图像频域上图
title('信号的频域波形');
xlabel('频率/hz');
ylabel('电压/v');
% axis([-5e+5 5e+5 0 0.6]);
axis([-5e+5 5e+5 0 0.8]);
 %% 滤波器的设置
% f=1:1:F;%频率序列
w=2*pi*f;
R=1.0010e+05;%电阻值
C=100e-12;%电容值
Fc=1/(2*pi*R*C);%截止频率
Para=R*C*1i;
for n=1:length(f)
    A(n)=abs(1/(1+(1/(Para*w(n)))));%幅值衰减系数
    P(n)=angle(1/(1+(1/(Para*w(n))))) * 180 / pi;%相移系数
end
figure(2);
subplot(2,1,1);
plot(f,A,'r');%幅值曲线
axis([0 3e+5 0 1]);
title('幅值衰减特性');
subplot(2,1,2);
plot(f,P,'blue');%相位曲线
axis([0 3e+5 0 100]);
title('相位特性');
Func=tf([1 0],[1 1/(R*C)]);%系统的传递函数
figure(3);
bode(Func);%系统的波特图
title('幅频特性');

%% 输出信号
[yout,tout] = lsim(Func,y,t);%滤波后信号图像
%-----------------------时域图像------------------------------------
figure(4);
subplot(2,1,1);
plot(t,y);
title('原始信号');
xlabel('时间/s');
ylabel('电压/v');
subplot(2,1,2);
plot(tout,yout);
title('滤波后的时域波形');
xlabel('时间/s');
ylabel('电压/v');
%------------------------------频域图像---------------------------------
q=fft(yout);
q_d=abs(fftshift(q));
figure(5);
subplot(2,1,1);
plot(f,h_d/5000);
title('输入信号的频谱');
xlabel('频率/hz');
ylabel('电压/v');
% axis([-5e+5 5e+5 0 0.6]);
axis([-5e+5 5e+5 0 0.8]);
subplot(2,1,2);
plot(f,q_d/5000);
title('滤波后的频谱');
xlabel('频率/hz');
ylabel('电压/v');
% axis([-5e+5 5e+5 0 0.6]);
axis([-5e+5 5e+5 0 0.8]);
%-------------------------------功率谱------------------------------------
figure(6);
subplot(2,1,1);
ypsd=h_d.*conj(h_d);
plot(f,ypsd);
title('输入信号功率谱');
xlabel('频率/Hz');
ylabel('W/Hz');
% axis([-5e+5 5e+5 0 0.6]);
axis([-5e+5 5e+5 0 12e+6]);
subplot(2,1,2);
youtpsd=q_d.*conj(q_d);
plot(f,youtpsd);
title('输出信号功率谱');
xlabel('频率/Hz');
ylabel('W/Hz');
% axis([-5e+5 5e+5 0 0.6]);
axis([-5e+5 5e+5 0 5e+6]);
%-------------------------------自相关函数--------------------------------
figure(7)
subplot(2,1,1);
[Rx,maxlags]=xcorr(y,'unbiased');  %信号的自相关
if fs>10000  %调整时间轴单位及标签,便于观测波形
    plot(maxlags/fs*1000,Rx/max(Rx));
else
    plot(maxlags/fs,Rx/max(Rx));
end
title('输入信号自相关函数');
xlabel('时间/s');
ylabel('R(t)');
subplot(2,1,2);
[Rx1,maxlags1]=xcorr(yout,'unbiased');  %信号的自相关
if fs>10000  %调整时间轴单位及标签,便于观测波形
    plot(maxlags1/fs*1000,Rx1/max(Rx));
else
    plot(maxlags1/fs,Rx1/max(Rx));
end
title('输出信号自相关函数');
xlabel('时间/s');
ylabel('R(t)');

注意传递函数tf的用法。

tf([1 1],[1 1 1])表示响应函数(s+1)/(s^2 + s + 1)

你可能感兴趣的:(MATLAB)