MATLAB实现一阶RC滤波器
生活随笔
收集整理的這篇文章主要介紹了
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 dataSourceTypecase 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 1y=A*sawtooth(2*pi*F*t,0.5); %三角波case 2y=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)); elseplot(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)); elseplot(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 dataSourceTypecase 0y=A*sin(2*pi*F1*t); %頻率為20khz正弦波case 1y=A*(sin(2*pi*F2*t)+sin(2*pi*F3*t) ); %頻率為25khz和5khz雙音正弦波case 2y=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)); elseplot(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)); elseplot(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实现一阶RC滤波器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用ChemDraw选择结构
- 下一篇: Python 读取图片文件转换格式