matlab-fft求取给定数据的频率及对应的滤波器设计
fft变换可以求取信号的频率点,有利于台架实验分析数据中的噪声以及滤波,对台架实验中的位置环控制具有较好的作用。matlab中含有fft函数可以直接求取频率点。但是在程序的理解中需要注意的是:
1、采样频率:就是每秒钟采集多少个数据点; 2、分辨率:采样频率/(一共采集了多少个数据点); 3、对应频谱图的横坐标(每个点的频率):(0:N-1)*分辨率 4、纵坐标为fft返回值的2倍 5、最后画图采用一半坐标显示就可以 对应的matlab程序为:
clear all; clc; T = 5; omega = 2*pi/T; i = 1; for t=0.1:0.1:10 y(i) = 3*sin(omega*t); %注意频率为0.2 % y(i) = 3*sin(omega*t) + 5*cos(2*pi*t+3); sample(i) = t; i = i+1; end; plot(sample,y); N = length(sample); matlab_fft = figure; yfreq = fft(y)/N ; % yfreq = fftshift(y)/N ; f = (0:N-1)*10/N; yfreq =yfreq*2; plot(f(1:N/2),abs(yfreq(1:N/2)));
对应生成的matlab图像为: 对应的频率图像为:
滤波器设计
time = 1:1000; fre1 = 500; fre2 = 2000; fs = 6000; % sample frequency singal1 = sin(2*pi*fre1*time/fs); singal2 = 0.3*sin(2*pi*fre2*time/fs); singal = singal1+ singal2; figure(1) subplot(311) plot(singal1); subplot(312) plot(singal2); subplot(313) plot(singal); f = (1:N)*6000/N; % % show the frequency plot fft_result1 = abs(fft(singal1)); fft_result2 =abs(fft(singal2)); fft_result = abs(fft(singal)); N =1000; figure(2) subplot(311) plot(f(1:N/2), fft_result1(1:N/2)/N*2); subplot(312) plot(f(1:N/2), fft_result2(1:N/2)/N*2); subplot(313) plot(f(1:N/2), fft_result(1:N/2)/N*2); % % filter design filter_lowpass = fir1(128,1000/3000); %1000/3000是截止频率 figure(3) freqz(filter_lowpass) % % filter the plot signal_filter = filter(filter_lowpass, 1, singal); figure(4) plot(signal_filter); after_filter = abs(fft(signal_filter)); figure(5) plot(f(1:N/2), after_filter(1:N/2)/N*2);
原始信号的时域图 原始信号的频谱图 低通滤波器 滤波后的波形图 滤波后的频谱图
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
学习笔记 Day54(梯度,激活函数)