function [freq,y] = self_FFT(x,fs)
% freq 返回的真实频率
% y 返回的真是幅值
% x 输入信号
% 采样频率 fs = 1/T (T采样时间间隔)
N = length(x);
xfft = abs(fft(x,N)) * 2/N; % 快速傅里叶变换
y = xfft(1:floor(N/2)); % 幅值
y(1) = y(1)/2; % 0Hz时的幅值
freq = (0:N-1) * fs/N; % 频率
freq = freq(1:floor(N/2)); % 真实频率范围
end
由于matlab自带fft()函数无法表示真正的频率与幅值,所以本文参考网络资料自写了一个。
例子:
fs = 500;
% 采样频率要大于信号最高频率的2倍
t = 0 : 1/fs : (2-1/fs);
x = 10*sin(2*pi*100*t) + 15*cos(2*pi*200*t) + 8;
% 调用函数
% [f,y] = self_FFT(x,fs);
% 不调用函数
N = length(x);
xfft = abs(fft(x,N)) * 2/N; % 快速傅里叶变换
y = xfft(1:floor(N/2)); % 幅值
y(1) = y(1)/2; % 0Hz时的幅值
freq = (0:N-1) * fs/N; % 频率
f = freq(1:floor(N/2)); % 真实频率范围
plot(f,y);
title('快速傅里叶变换');
xlabel('频率');
ylabel('幅值');
运行结果:
====
为了方便调用self_FFT()函数,可以将函数文件添加到matlab安装路径下的 toolbox中
安装位置...\MATLAB\toolbox
将函数文件或文件夹选中 并 保存
参考资料:
如何 FFT(快速傅里叶变换) 求幅度、频率(超详细 含推导过程)_傅里叶变换的频率_Xav Zewen的博客-CSDN博客