matlab版本:2020b
simulink求解算法:Auto(ode3tb),变步长运行
首先是Simulink中如何使用powergui进行FFT分析。
powergui在Simulink Library Browser中的路径为Simscape/Electrical/Specialized Power System/Fundammental Blocks。将powergui拖到Simulink中即可完成布置。
FFT在图中已用红框标出。

为了使用FFT Analysis,还需要一些其他设置。
a.获取信号
FFT中的信号来自于Scope,还需要对Scope进行设置。红框中为关键设置。变量名称随意。数据会同时存储到工作区中,也方便在工作区中进行二次分析。
2.模型参数
图中绿框给出了设置的路径。红框中不要选中。

经过设置后,重新运行仿真,即可获得数据,进入FFT分析。步骤如下。

使用powergui进行FFT分析,简单易上手,显示结果直观。而且可以看到THD。
但当需要获取一些特征频率的含量时,并不方便。因而想到使用m文件实现FFT分析。

注意到,在经过上述设置后,simulink文件运行后会在工作区中生成结构体变量。

Vabc_n内数据如下:

Vabc_n.time中存储了每个采样点的时间。Vabc_n.signals中存储了信号数据。

Vabc_n.signals.values中即为采样数据。

那么可以对该结构体变量进行FFT分析。
由于笔者对一直没有使用过fft函数。使用doc fft查看了例程。
其中关于余弦波的代码如下:
英文注释为例程中自带的注释,中文注释为笔者添加。

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave
X = [x1; x2; x3];
n = 2^nextpow2(L);         %为了优化fft性能,需要保证信号长度为2的幂次。
dim = 2;                   %对信号的每一行进行fft。默认情况下为1,即对每一列进行fft分析。
Y = fft(X,n,dim);
P2 = abs(Y/L);             %双边频谱
P1 = P2(:,1:n/2+1);           %单边频谱
P1(:,2:end-1) = 2*P1(:,2:end-1);
for i=1:3                  %展示频谱分析结果subplot(3,1,i)plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))title(['Row ',num2str(i),' in the Frequency Domain'])
end

运行结果如下:

据此,笔者编写了如下的代码

function output = FFTofSignal(signals)
if class(signals)=="struct"L = length(signals.time);
%     为了算法性能考虑,信号长度最好为2的幂次值n = 2^nextpow2(L);
%     显然,n/2<L<n,截取信号长度可以为n/2或n/4时,3L可能超出索引,故取n/8。L = n/8;t = signals.time(L:3*L);    %取信号的中间一段进行分析,这里是截取时间Fs = (length(t)-1)/(t(end)-t(1));   %采样频率=数据点个数/时间长度X = signals.signals.values(L:3*L,:);    %截取信号Y = fft(X,L,1);                     %FFT分析P2 = abs(Y/L);                      %计算双侧频谱P1 = P2(1:L/2+1,:);                   %单侧频谱P1(2:end-1,:) = 2*P1(2:end-1,:);f = Fs*(0:(L/2))/L;output = figure;subplot(2,1,1)plot(t,X);                      %输出原信号subplot(2,1,2)plot(f,P1);                     %输出FFT分析结果title('Single-Sided Amplitude Spectrum of X(t)')xlabel('f (Hz)')ylabel('|P1(f)|')
elseoutput = [];disp("信号类型为结构体,请确认后再输入")
end

运行temp = FFTofSignal(Vabc_n);得到下图。原数据图和FFT分析结果均已放大局部区域。

可以看到分析结果并不好。原数据中谐波含量少,可以近似认为仅含有50Hz的基波分量。而FFT分析结果中,呈现了大量的其他频率。
但笔者并不清楚原因。在请教朋友后,发现了问题所在。
笔者在Simulink仿真中使用了变步长求解器,这意味着仿真得到的波形数据的采样频率不是固定的,而从fft的例程中可以看到,函数fft默认采样频率固定。实际采样频率不固定,导致了分析结果不理想。同时,DFT的理论建立在采样频率固定的基础上。如果采样频率不固定,则无法使用DFT。
为了对信号进行DFT,需要将信号采样频率固定,笔者想到了两种方法:
1.使用定步长仿真,包括连续仿真模式下的定步长模式和离散仿真。
2.对变步长仿真结果进行插值,获得定步长信号。
由于信号数据较多,为了减小运算量,采用线性插值。插值结果如下图所示。

图中从上到下依次为:
横坐标为时间,纵坐标为测量数据的原始信号
横坐标为自然数序列,纵坐标为测量数据的原始信号
横坐标为自然数序列,纵坐标为插值数据

完整代码如下

function output = FFTofSignal(t0,cycles,f0,fmax,signals)
% t0  起始时间
% f0  基频频率
% cycles  周期数
% fmax    最大频率
% signals     输入结构体信号
if class(signals)=="struct"time = signals.time;if cycles/f0>max(time)error("基频太小或周期数太多")end[~,I1] = min(abs(time-t0));      %获取与t0最近的时间点,即信号起点索引为I1;t_end = t0 + cycles/f0; [~,I2] = min(abs(time-t_end));      %信号终点索引为I2;X = signals.signals.values;         %截取信号 L = I2 - I1;                            %需要分析的信号长度。n = 2^(nextpow2(L)-1);      %为了算法性能考虑,信号长度最好为2的幂次值t_step = (time(I2)-time(I1))/n;t = t0:t_step:t_end;for i = 1:length(t)[~,I] = min(abs(time-t(i)));X1(i,:) = X(I,:)+(X(I+1,:)-X(I,:))/((time(I+1)-time(I)))*(t(i)-time(I));      %使用线性插值获取数据点,分析得到的频谱会与实际频谱不相同,但影响应该不大。endFs = (length(t)-1)/(t(end)-t(1));   %采样频率=数据点个数/时间长度Y = fft(X1,n,1);                     %FFT分析P2 = abs(Y/n);                      %计算双侧频谱P1 = P2(1:n/2+1,:);                   %单侧频谱P1(2:end-1,:) = 2*P1(2:end-1,:);f = Fs*(0:(n/2))/n;h_f = f0:f0:fmax;for i = 1:length(h_f)[~,I1] = min(abs(f-h_f(i)));I(i) = I1;endP = P1(I,:);THD = sqrt(sum(P1(1:end,:).^2))/P(1);THD1 = max(mean(THD),median(THD));output = THD1;figure;subplot(2,1,1)plot(time,X,'b')hold onplot(t,X1,'r')hold offcycles1 = floor(time(end)*f0);title(['Selected signal:',num2str(cycles1),'cycles,FFT windows(in red):',num2str(cycles),'cycles'])xlabel('Time(s)')ylabel('Signal mag.')subplot(2,1,2)bar(f,P1*100/P(1));title(['Fundamental(',num2str(f0),'Hz)=',num2str(P1(I(1))),',THD=',num2str(THD1*100),'%'])xlabel('Frequency')ylabel('Mag(% of Fundamental)')xlim([0,fmax])
elseoutput = [];disp("信号类型为结构体,请确认后再输入")
end

运行结果如下图所示。

从图中可以看到两者的分析结果相近,可以信任m文件的运行结果。
如果需要获取每一个频率的信息,可以将输出从THD更换为P1或P,P中明确给出了谐波信息。

Simulink中powergui的FFT分析怎么用m文件实现?相关推荐

  1. 飞控中加速度计数据fft分析

    加速度计原始数据高频噪声很严重,使用时需要设计合适的滤波器将其滤掉. matlab对加速度计原始数据,30Hz低通滤波之后的数据进行fft分析如下: clc;source=simout1; filte ...

  2. simulink中的FFT 小白入门

    simulink中的FFT 小白入门 前言 一.FFT是什么? 二.simulink中的FFT 1.FFT的实现方式 2.具体操作步骤 1.搭建模型 2.运行仿真 3.FFT分析 总结 前言 simu ...

  3. matlab fft simulink,在Simulink中复制MATLAB的FFT?

    很抱歉也许不准确地说出这个问题,但我对Simulink和Stack都很新 . 我正试图在simulink中处理语音信号,就像我在Matlab中所做的那样,我的输出有问题 . 在Matlab中,FFT看 ...

  4. Simulink 中连续与离散模型的区别

    一.连续系统 VS 离散系统 1.定义 连续系统:系统状态的改变在时间上是连续的. 离散系统:系统状态的改变只发生在某些时间点上. simpowersystem 的库中基本所有模型都属于连续系统,因为 ...

  5. 示波器数据用matlab进行fft,示波器CSV波形数据导入Matlab进行FFT分析.doc

    示波器CSV波形数据导入Matlab进行FFT分析 1,将CSV文件拖到workspace窗口,弹出的Import Wizard窗口中,点选"Next",新窗口中选第二项" ...

  6. matlab示波器导出csv数据,示波器CSV波形数据导入Matlab进行FFT分析

    示波器CSV波形数据导入Matlab进行FFT分析 1,将CSV文件拖到workspace窗口,弹出的Import Wizard窗口中,点选"Next",新窗口中选第二项" ...

  7. simulink中detailed thyristor和thyristor的区别(针对latching current和turn-off time的对比仿真)

    在simulink的simscape库下的电气元件中,有晶闸管(thyristor)和精细晶闸管(detailed thyristor)两种器件,在simulink中两个器件性能相似,只有在特定的情况 ...

  8. 在FFT分析在而立之年的展望与总结

      这是Sri Welaratna 在 原文 : https://www.dataphysics.com/30_Years_of_FFT_Analyzers_by_Sri_Welaratna.pdf# ...

  9. FFT分析的加窗和重叠

    FFT分析的加窗和重叠 这将通过实例说明加窗和重叠对频谱分析的影响.用10Hz的正弦波,以说明重叠窗函数在频谱分析过程中的不同之处. 重叠分析,就是连续分析的时域数据块通过指定的时间纪录百分比进行重叠 ...

  10. simulink中S函数格式

    意义 s函数是system Function的简称,用它来写自己的simulink模块,用来实现simulink中无法直接提供的模块.s函数可以利用matlab的丰富资源,而不仅仅局限于simulin ...

最新文章

  1. 2兼容鼠标无法禁用一直乱动_雷柏ralemo气垫鼠标:金属镂空无线充电,机械滚珠情怀在线...
  2. Spring面试题和答案
  3. mysql sort aborted_mysql排序中断(Sort aborted)-mysql临时文件无法写入
  4. PHP(一)——概述及服务器配置
  5. logback logback.xml 常用配置详解
  6. 二. python面向对象(内置方法and析构函数)
  7. tomcat下载安装步骤(超详细)
  8. 语音增强二,麦克风阵列
  9. 文件夹压缩为war包
  10. leetcode.1024. 视频拼接
  11. 百度这个写在控制台的消息:2021百度校招
  12. 联发科之殇:破碎高端梦
  13. python根据关键词实现信息检索推荐(使用深度学习算法)
  14. Freemarker操作word文档
  15. 163vip邮箱登录,163邮箱怎么登陆?如何登录163vip邮箱?
  16. Pytorch——XLNet 预训练模型及命名实体识别
  17. Android 6.0 指纹识别功能学习(一)----阿冬专栏!!!
  18. Codeforces - 750A. New Year and Hurry
  19. SEO的职业生涯:从seo初级水平到seo资源整合营销总监的历程
  20. Laravel框架中config配置文件的使用

热门文章

  1. Arduino 利用ADS1115 AD转换模块进行数据读取
  2. 用微信小程序发红包的两种方法
  3. EASYUI 登陆框界面
  4. JavaScript - 360浏览器默认使用极速模式打开网页
  5. 手把手教你使用SPSS做出亚组分析的交互作用效应(p for Interaction)
  6. 基于GARCH模型的股市研究与危机预警——R语言实现
  7. 【线代】矩阵转置性质及代码证明
  8. mysql execute stmt_[转载]MySql 数据库--stmt语句
  9. 直面程序人生,始于当下,奔赴未来!
  10. Word2010页眉添加两条横线