花月mmc 发表于 2019-7-22 17:32:00

MATLAB中做FFT

补贴,原版不见了。。。

FFT很常见的应用,下面找到一段代码,来源
万永革编著.数字信号处理的MATLAB实现.北京:科学出版社,2012.05.
第三章
代码如下:
%Samp3_13
clf;
clear all
clc
fs=100;N=128;   %采样频率和数据点数
n=0:N-1;t=n/fs;   %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y=fft(x,N);    %对信号进行快速Fourier变换
mag=abs(y)*2/N;   %求得Fourier变换后的振幅
f=n*fs/N;    %频率序列
figure(1)
plot(t,x);
figure(2)
subplot(2,2,1),
plot(f,mag);   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
%对信号采样数据为1024点的处理
fs=100;N=128;;n=0:N-1;t=n/fs;
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y=fft(x,N);   %对信号进行快速Fourier变换
mag=abs(y)*2/N;   %求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
%axis()
结果如下图
原始波形FFT变换

花月mmc 发表于 2019-7-22 18:59:19

关键是这个楼层,有人问怎么用,下面以两个例子说明
例子1PSCAD导出数据进行FFT
以最简单的分压器例子vdiv为例


由于上面的仿真设置为采样频率为f=100Hz,数据点N为128与1024
因此仿真时间步长为1/f=0.01s=10ms=10000us

红色方框内两个参数保持一致
仿真时间为11s,数据点为1100个
但PSCAD对于步长较长的仿真会求解错误(原理大概同输电线路——输电线路、电缆长度问题),

错误如下:
50Hz,60Hz波形不是正弦波,可以行尝试




因此选择下图的设置

f=1000Hz,步长为1/f=1000us仿真时间为1.1s,数据点为1100个
空白处右键设置




保证绘图与输出通道同等采样
仿真频率设置为50Hz,空白处ctrl+g改变频率


提取其中的电压数据
找到电压波形,右键全选


桌面新建记事本,将数据粘贴后保存,打开MATLAB导入数据


具体内容参见论坛中的方法,给出一个链接
利用MATLAB软件画PSCAD仿真波形图
https://www.mmc-hvdc.com/t-353.html


运行程序
fs=1000;N=128;   %采样频率和数据点数
n=0:N-1;t=n/fs;   %时间序列
x=MidPointVoltage1(1:128)'; %信号转置,MidPointVoltage1为电压向量名,可根据情况更改
y=fft(x,N);    %对信号进行快速Fourier变换
mag=abs(y)*2/N;   %求得Fourier变换后的振幅
f=n*fs/N;    %频率序列
figure(1)
plot(t,x);
figure(2)
subplot(2,2,1),
plot(f,mag);   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;      %对信号采样数据为128点的处理
fs=1000;N=1024;;n=0:N-1;t=n/fs;
x1=MidPointVoltage1(1:1024)'; %信号
y=fft(x1,N);   %对信号进行快速Fourier变换
mag=abs(y)*2/N;   %求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;结果如下图



图中表明,数据点越多结果越准确
想了解等过内容可以选购推荐书籍
完结撒花
{:8_615:}





花月mmc 发表于 2019-7-22 20:16:49

例子2 ATP-EMTP数据FFT
首先将仿真参数设置下

参数如下

元件默认即可,重在FFT

将数据导出,英文路径为宜

利用上面同样的程序做FFT结果
由于atp-emtp本身可以用FFT,结果如下


虽然FFT不是很难,但仍然有很多需要思考的地方,例如幅值相位变化的问题,采样值与结果等


beixiaoman 发表于 2019-8-16 18:24:21

mag=abs(y)*2/N
求变换后的振幅时为什么要乘以2除以N?{:7_578:}

花月mmc 发表于 2019-8-16 18:52:22

beixiaoman 发表于 2019-8-16 18:24
mag=abs(y)*2/N
求变换后的振幅时为什么要乘以2除以N?

给出了参考资料了哦,查一下就知道

cooc8 发表于 2019-12-2 22:25:38

学习了         

wang 发表于 2020-3-20 18:49:38

点赞。学习ing

mmm 发表于 2020-3-26 13:01:58

请问有matlab小波变化和小波能量熵的介绍吗?

r2019 发表于 2020-3-28 00:23:46

用了下程序,还是到最后几个点 高频有幅值 不太理想

r2019 发表于 2020-3-28 00:24:03

r2019 发表于 2020-03-28 00:23
用了下程序,还是到最后几个点 高频有幅值 不太理想

可能是自己模型的问题吧
页: [1] 2 3
查看完整版本: MATLAB中做FFT