MatLab中的fft变换(快速傅里叶变换)

本文章内容只作为个人学习总结使用

目录

说明:

基本的FFT使用方法:

        1、简单的FFT功能介绍:

        2、恢复幅度轴,创建频率轴:


说明:

        本文章主要进行MATLAB中fft函数基本使用方法的讨论,关于fft的概念以及为什么要进行fft等信号处理方面的内容不做叙述。

基本的FFT使用方法:

        1、简单的FFT功能介绍:

        在这一步我们首先需要构建一个正弦函数f=sin(2*pi*f*t)不难看出本例中的正弦函数的频率为1,其中fs是我们的采样频率,当采样频率为100的时候 我们的采样周期1/fs 为0.01s 也就是每隔0.01s取一个点。

clear;
fs=100;%采样频率
t=0:1/fs:10-1/fs %采样周期
%%原始信号的创建
f=sin(2*pi*1*t);

subplot(311)
plot(t,f)

%%fft部分(1) 此时我们其实可以发现他的幅度不对横轴也不对。
f_fft=fft(f);
f_amp=abs(f_fft);

subplot(312);
plot(f_amp);


运行结果:

 

可以看到,在信号创建的部分我们创建了一个1hz的正弦波,关于MATLAB中fft的函数使用非常简单,只需要fft(f)就可以将信号进行fft变换,在变量去也可以看到计算结果是1000个复数,其中有几个点我们可以重点关注一下:他的第一个点和第501个点(因为在本例中我们取了1000,如果取其他偶数点的情况此例就变成其他长度的中点 例如10000点就是5001点)这两个点都是实数,同时可以发现除了第一个点其余的点关于501点共轭对称关于这两个点在后面会用到。

上述代码貌似很轻松的实现了fft的功能但是只要稍微的观察就可以发现他的幅度和频率是不对的(如上图),双边谱来说幅度应该是0.5每边而且他的横轴是数据点数而不是频率,这是我们首先要处理的一个问题:幅度量纲归为,频率轴设定。

        2、恢复幅度轴,创建频率轴:

        在这一部分,我将主要介绍如何恢复单边谱的频率轴和幅度,关于单边谱和双边谱是什么,有需要的可以自行参阅任何一本信号与系统教材,这里只讲MATLAB中的处理。

        首先第一个问题,为什么他的幅度是不对的呢?根据我查到的资料其中有提到的是在dft的公式中,其实已经蕴含了1/N项,但是MATLAB中fft算法并没有,所以其计算出来的幅值是大了N倍,我们将其除以N就可以了。

        第二个如何恢复频率轴,直接绘图,MATLAB会默认将我们的点数N作为横轴,这其实是不对的,我们的横轴应该是频率f,那么f怎么创建呢,我们不妨这样理解,我们以采样频率Fs=100Hz采样了N=1000个点 那每个点代表的频率就是df=Fs/N以单边谱为例,那我们所需的f轴就只需要我们用df*我们创建的点数(包括正负)就可以了,上个部分中我们说过,我们的fft的结果是关于N/2+1共轭对称的,所以我们只只取其对称的一部分就可以了。

clear;
fs=100;%采样频率
t=0:1/fs:10-1/fs%采样周期
%%原始信号的创建
f=sin(2*pi*10*t);

subplot(311)
plot(t,f)

%%fft
f_fft=fft(f);
N=length(f_fft);%这里取出f_fft也就是信号做完fft之后的序列长度

Y=f_fft(1:N/2+1);
Y(2:end-1)=2*Y(2:end-1);

Y_amp=abs(Y)/N;

df=fs/N;

f=(0:1:N/2)*df;
subplot(312);
plot(f,Y_amp)

 

至此我们就绘制出了频率幅度都正确的单边谱。

 

 

 

 

        

### MATLABFFT的应用及其常见问题 #### 1. FFT基本概念 快速傅里叶变换(FFT)是一种高效的算法来实现离散傅立叶变换(DFT),用于分析信号的频率成分。在MATLAB环境中,`fft()` 函数提供了这一功能[^1]。 #### 2. 使用 `fft()` 计算频谱 为了获得正确的频域表示,在调用 `fft(x)` 后还需要考虑采样率以及如何解释输出的结果。对于长度为N的时间序列x[n],其对应的频率范围是从0到fs/2 (其中 fs 是采样频率),而 fft() 的默认输出则是从直流分量开始直到最高可解析频率(-fs/2 到 +fs/2)。 ```matlab Fs = 100; % Sampling frequency T = 1/Fs; % Sample time L = 1000; % Length of signal t = (0:L-1)*T; % Time vector f = Fs*(0:(L/2))/L; % Single-sided frequency axis ``` #### 3. 解决横纵坐标意义不明的问题 当绘制频谱图时,如果直接使用 abs(fft(y)) 来作为幅度,则会得到双边谱;通常情况下更关心的是单边幅值谱,因此需要除以 L 并取前半部分数据。另外需要注意单位转换,比如电压变为伏特每赫兹(V/Hz)。 ```matlab Y = fft(y); P2 = abs(Y/L); % Two-sided spectrum P2 P1 = P2(1:L/2+1); % Single-sided spectrum P1 P1(2:end-1) = 2*P1(2:end-1);% Double the amplitude except DC and Nyquist components. plot(f,P1) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|P1(f)|') ``` #### 4. 关于 `fftshift` 的应用 `fftshift` 可以将零频率移动至中心位置,这对于某些类型的可视化非常有用,特别是处理实数输入的情况下可以更容易观察负频率的影响。但是要注意这仅影响显示方式而不改变实际的数据结构。 ```matlab Fshft = fftshift(P2); % Shift zero-frequency component to center of spectrum f_shft = (-L/2:L/2-1)*(Fs/L);% Frequency domain after shifting figure; stem(f_shft,Fshft,'.') title('Double-Sided Amplitude Spectrum with Zero-Frequency Centered') xlabel('Frequency (Hz)') ylabel('|F(\omega)|') grid on ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值