FFT分析代码

本文利用MATLAB编程实现FFT分析,代码可处理mat格式与csv格式文件数据。

处理mat格式

源代码

%{
利用MATLAB内置函数实现FFT分析功能,此段代码处理mat格式
author:PEZHANG
time:2021.12.5
%}
clear;clc;

%加载数据
load('HFSI.mat')    
ia = data{3}.Values.data(40001:80000,1);    % 截取数据段(4s-8s)进行分析
Fs=10000;                                   %离散系统采样频率
Ts = 1/Fs;
L = size(ia,1);                             %数据的个数(长度),数据持续的时间除以采样频率
t = (0:L-1)*Ts;                             %生成离散时间序列,方便绘制时域波形
Y = fft(ia);                                %FFT分析,获得数据是复数,a+bi形式
P2 = abs(Y/L);                              %DFT计算出的幅值不是真实的幅值,需要进行幅值变换,基频除以L,非基频除以L/2
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);                %非基频的正序分量转化为正常幅值
f = Fs*(0:(L/2))/L;

%绘制时域波形图
figure
plot(t,ia)

%设置图片格式
xlabel('f (Hz)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Current (A)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
title('')
legend({'ia'},'FontSize',10.5,'TextColor','black','Location','best');
set(gcf,'unit','centimeters','position',[30 15 15 7]);                          %设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','normal');    %设置坐标轴数字大小
legend('boxoff')                                                                %删除图例的背景和轮廓
grid on
set(gca,'gridlinestyle',':','Gridalpha',1);                                     %为了好看,将打开的网格导引线设置为虚线

%绘制频域图片
figure
plot(f,P1)                                                                      %横轴为频率,纵轴为幅值

%设置图片格式
xlim([2350 2650])
ylim([0 0.05])
xlabel('f (Hz)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Current (A)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
title('')
legend({'ia'},'FontSize',10.5,'TextColor','black','Location','best');
set(gcf,'unit','centimeters','position',[30 15 15 7]);                          %设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','normal');    %设置坐标轴数字大小
legend('boxoff')                                                                %删除图例的背景和轮廓
grid on
set(gca,'gridlinestyle',':','Gridalpha',1);                                     %为了好看,将打开的网格导引线设置为虚线

运行演示

在这里插入图片描述

在这里插入图片描述

处理csv格式

源代码

%{
利用MATLAB内置函数实现FFT分析功能,此段代码处理csv格式
author:PEZHANG
time:2021.12.5
%}
clear;clc
% 加载数据,设置数据属性(长度、采样频率等)
AAA = xlsread('tek0014_HFSI_no_load.csv');
ia = AAA(21:1000020,2);
Fs=1000000;                         %采样频率1MHz
Ts = 1/Fs;
L = size(ia,1);                     %数据长度
t = (0:L-1)*Ts;

Y = fft(ia);                        %FFT分析获得数据是复数,a+bi形式
P2 = abs(Y/L);                      %DFT计算出的幅值不是真实的幅值,需要进行幅值变换,基频除以L,非基频除以L/2
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);        %非基频的正序分量转化为正常幅值
f = Fs*(0:(L/2))/L;

% 绘制时域波形、设置图片格式
figure
plot(t,ia)

ylim([-1 1])
xlabel('f (Hz)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Current (A)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
title('')
lgd = legend({'ia'},'FontSize',10.5,'TextColor','black','Location','best');
% lgd.NumColumns = 1;    %创建图例显示的位置,2--横排显示两个图例,1--竖排显示两个图例
% set(gca,'XTicklabel',{'0','0.1','0.2','0.3','0.4','0.5','0.6','0.7','0.8','0.9','1.0'}) %重设坐标刻度

set(gcf,'unit','centimeters','position',[30 15 15 7]);                          %设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','normal');    %设置坐标轴数字大小
legend('boxoff')                                                                %删除图例的背景和轮廓
grid on
set(gca,'gridlinestyle',':','Gridalpha',1);                                     %为了好看,将打开的网格导引线设置为虚线

%绘制频域图片、设置图片格式
figure
plot(f,P1)

xlim([2350 2650])
xlabel('f (Hz)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Current (A)','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
title('')
lgd = legend({'ia'},'FontSize',10.5,'TextColor','black','Location','best');
% lgd.NumColumns = 1;    %创建图例显示的位置,2--横排显示两个图例,1--竖排显示两个图例

set(gcf,'unit','centimeters','position',[30 15 15 7]);%设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','normal');    %设置坐标轴数字大小
legend('boxoff')                                                                %删除图例的背景和轮廓
grid on
set(gca,'gridlinestyle',':','Gridalpha',1);                                     %为了好看,将打开的网格导引线设置为虚线

运行演示

在这里插入图片描述
在这里插入图片描述

参考链接
https://www.mathworks.com/help/matlab/ref/fft.html
https://www.ilovematlab.cn/thread-300889-1-1.html

<think>好的,我现在需要处理用户关于MATLABFFT分析的示例代码请求。首先,用户提到他们已经在站内引用了两个资料,引用[1]提供了画幅值谱和包络谱的代码片段,而引用[2]讨论了FFT的基本原理和步骤。我需要结合这些信息来生成合适的回答。 首先,我应该确认用户的需求。他们需要MATLAB中进行FFT分析的示例代码,可能包括生成信号、应用FFT、绘制频谱图等步骤。根据引用[1]中的代码示例,用户可能对如何正确使用FFT函数以及绘图部分特别感兴趣。引用[2]提到分步骤解释,因此我需要将代码分解成清晰的步骤,如生成信号、添加噪声、FFT变换、计算幅值、绘制结果等。 接下来,我需要确保代码的正确性和完整性。例如,生成测试信号时,可能需要包含多个频率成分,并添加噪声以模拟真实情况。在应用FFT时,需要注意采样频率和点数,处理单边频谱,并正确计算幅值。引用[1]中的代码使用了2*abs(y_ft(1:nfft/2))/length(y),这可能涉及到归一化和单边谱的处理,我需要解释这些步骤。 另外,用户可能对如何解释这些代码背后的原理有疑问,比如为什么使用汉明窗,或者为什么取前半部分的频率。因此,在代码注释中简要说明这些步骤的原因会更好。例如,引用[2]中提到的FFT基本原理,可以在回答中提到以减少频谱泄漏为目的的加窗处理。 还需要检查LaTeX格式是否符合要求。用户要求行内数学公式用$...$,独立公式用$$...$$。例如,在解释频率分辨率时,可能需要使用公式$\Delta f = \frac{f_s}{N}$,这里需要用行内格式。同时,确保所有数学表达式正确使用LaTeX语法,比如积分、傅里叶变换等。 然后,生成相关问题。根据用户提供的示例,问题应该围绕FFT分析的步骤、参数影响、窗函数作用、应用场景等。例如,如何选择FFT点数,窗函数的作用,以及FFT在音频处理中的应用。 最后,确保回答结构清晰,分步骤讲解,并引用提供的资料。例如,在绘制幅值谱时,引用[1]的代码示例,并在相关部分标注引用标识。同时,确保代码块语法正确,使用正确的MATLAB函数,如fftfftshift等,并适当添加注释。 现在需要整合这些思考,生成一个包含示例代码、分步解释、正确引用和相关问题的回答。还要注意避免使用Markdown格式,但用户允许在回答中使用代码块和引用标识。因此,最终回答应包括步骤说明、代码示例、解释,以及四个相关问题,并正确标注引用来源。</think>以下为MATLAB中使用FFT进行频谱分析的示例代码及分步说明,结合了幅值谱绘制和信号处理的关键步骤: --- ### MATLAB FFT分析示例代码 #### 1. 生成测试信号 ```matlab fs = 1000; % 采样率(Hz) t = 0:1/fs:1-1/fs; % 时间向量(1秒时长) f1 = 50; f2 = 120; % 信号频率成分(Hz) x = 0.7*sin(2*pi*f1*t) + sin(2*pi*f2*t); % 合成信号 x = x + 0.5*randn(size(t)); % 添加高斯白噪声[^2] ``` #### 2. 执行FFT变换 ```matlab nfft = 2^nextpow2(length(x)); % 优化FFT计算速度的采样点数 y_ft = fft(x, nfft); % 执行FFT变换[^1] f = fs/2*linspace(0,1,nfft/2); % 生成频率轴(单边谱) ``` #### 3. 计算幅值谱 ```matlab magnitude = 2*abs(y_ft(1:nfft/2))/length(x); % 幅值计算[^1] ``` #### 4. 绘制结果 ```matlab figure subplot(2,1,1) plot(t, x) title('原始信号(含噪声)') xlabel('时间(s)') subplot(2,1,2) plot(f, magnitude) title('单边幅值谱') xlabel('频率(Hz)') ylabel('幅值') grid on ``` --- ### 关键参数说明 1. **频率分辨率**:$\Delta f = \frac{f_s}{N}$,其中$N$为采样点数。本例中$f_s=1000$Hz,$N=1000$,分辨率为1Hz 2. **加窗处理**(可选):在FFT前添加汉明窗可减少频谱泄漏 ```matlab window = hamming(length(x))'; x_windowed = x .* window; % 应用窗函数[^2] ``` 3. **相位谱绘制**(扩展): ```matlab phase = angle(y_ft(1:nfft/2)); % 相位计算 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值