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

article/2025/9/23 10:46:16

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中明确给出了谐波信息。


http://chatgpt.dhexx.cn/article/k1S9IsA8.shtml

相关文章

示波器中波形如何在matlab中进行fft——入门篇

1、示波器数据导入matlab 首先&#xff0c;打开matlab选择&#xff0c;点击“导入数据”&#xff0c;选择需要分析的excel&#xff1b;在打开的界面处&#xff0c;鼠标选择需要处理的数据范围&#xff0c;选择输出类型为“数据矩阵”&#xff0c;导入所选内容。 导入数据表如下…

matlab电路图powergui怎么用,使用matlab中的powergui对采集的数据进行谐波分析#实验日记#...

从今天开始&#xff0c;准备根据实验的进度&#xff0c;不定时的写一些实验日记&#xff0c;一方面是对自己每天实验内容的总结&#xff0c;方便日后温习&#xff0c;另一方面&#xff0c;也是在这里与大家共享&#xff0c;相互学习&#xff0c;充分发扬互联网的共享精神。也希…

Power Designer

1 什么是Power Designer? PowerDesigner是Sybase公司的一款软件&#xff0c;使用它可以方便地对系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型和面向对象模型等。在项目设计阶段通常会使…

Matlab/simulink 2018a利用 powergui 进行FFT分析(傅里叶分析谐波)

首先你要有powergui模块在模型中 其次&#xff0c;你的信号会输入到示波器中 打开示波器左上角设置 在logging界面&#xff0c;勾选Log data to worksapce 然后可以更改信号名字&#xff0c;下面选择 structure with time 点击确定 然后运行 运行完毕以后&#xff0c;点…

simulink中对powergui的使用

步骤&#xff1a; 1.在仿真里面拖入powergui模块 2.设置所要分析的波形&#xff0c;保存入workspace&#xff0c;格式&#xff1a;Structure with time 3.进行仿真&#xff0c;完毕后&#xff0c;进入powergui的FFT Analysis 4.在Structure中选择信号名称等等。下面是开始计算…

关于MATLAB powergui 无法调整为discrete的解决方法

如下所示&#xff0c;powergui无法调整为其他的选项 解决方法如下

Simulink中步长、powergui采样时间、模块采样时间、控制周期的关系

Simulink中步长、powergui采样时间、模块采样时间、控制周期的关系 最近在搭模型的时候&#xff0c;对simulink中的各个“时间”产生了概念上的混淆&#xff0c;网上的资料也是鱼龙混杂&#xff0c;看了之后更是一知半解。因此本文针对Simulink中的各个时间做一个概念上的总结…

2021-08-26

电力电子技术仿真(一&#xff09;单相半波整流电路 一.powergui1.1poweigui的介绍1.2 powergui的位置 二、仿真单相半波整流电路2.1 器件的位置2.2电路的连接及仿真效果2.2.1 连接图2.2.2 仿真结果 三、Tips3.1 仿真图像不连续&#xff0c;看起来断断续续&#xff1f;3.2 设置p…

[配置]linux如何联网

以redhat发行版进行演示说明&#xff1a; 1、通过命令提示符查看主机&#xff08;windows&#xff09;的ip地址 2、进入linux&#xff0c;在网络配置文件&#xff08;/etc/sysconfig/network-sciptes/&#xff09;中将ip地址改为静态&#xff0c;并改为与主机同一网段&#xff…

Linux无法联网解决方案

首先打开网络连接,检查网络是否被禁用 方法一 cd /etc/sysconfig/network-scripts vi /etc/sysconfig/network-scripts/ifcfg-ens33 输入这两行指令,检查最下面的onboot是否为yes,如果为no 按i进入修改模式修改为yes,然后:wq退出编辑 方法二 如果方法一没有解决问题 点击…

linux命令界面联网

1、第一步cd 进入network -scripts目录 2、第二步vi 进入ifcfg -ens33 3、第三步选择编译>虚拟网络编辑器&#xff0c;进行接下来的配置IP地址&#xff0c;子网&#xff0c;网关等等 4、vi 进入ifcfg -ens33&#xff1b;然后要对6个地方进行更改&#xff0c;我已经标记出来…

Linux系统如何连接网络

准备工作 用虚拟机软件装好Linux系统,Linux都是以文件的形式存在。网络连接选择&#xff1a;桥接网卡打开centos虚拟机终端&#xff0c;root用户登录进入系统 以root身份登录进入界面 输入ip addr它是用来查看本地IP地址的 修改网卡配置文件&#xff0c;输入&#xff1a;v…

Linux联网,自用

我怀疑是DHCP的问题&#xff0c;我的连接方式不是static&#xff0c;是DHCP 的方式&#xff0c;我主机的dhcp一直是开着的&#xff0c;我怀疑是虚机的dhcp没有打开导致的&#xff0c; 也有可以是主机dhcp需要重新启动&#xff0c;但是这种概率不大&#xff0c;我下周试试 能连…

基于linux的几款物联网操作系统

这里写自定义目录标题 欢迎使用Markdo新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释…

如何让内网Linux机器联网

我们在安装内网Linux环境的时候需要联网下载各种安装包&#xff0c;可通过笔记本联网&#xff0c;然后路由给内网linux机器操作如下 1. linux机器和笔记本电脑配置成统一网段. 笔记本以太网ip内网Linux机器ip192.168.176.214192.168.176.1 2. 笔记本开启网络共享发现 3. 网卡…

linux上网方法

1、Linux网络设置&#xff1a; 依次单击【System】-->【Preferences】-->【Network Connections】&#xff0c;如下图所示&#xff1a; 依次单击【Wired】-->【System eth0】-->【Edit】&#xff0c;如下图所示&#xff1a; 勾选【Connect automaticlly】&#xf…

Linux基础之管理联网

1.查询ip的几种方式&#xff1a; ip, ifconfig, nmcli,nmtui [rootbogon ~]# nmcli ens160: 已连接 到 ens160"VMware VMXNET3"ethernet (vmxnet3), 00:0C:29:50:85:D3, 硬件, mtu 1500ip4 默认inet4 192.168.45.128/24route4 0.0.0.0/0route4 192.168.45.0/24inet6…

Linux如何访问网络 - 管理Linux的联网

文章目录 NetworkManagernmcli示例nmcli connection详解nmcli c shownmcli c 的 con-namenmcli c 的 ipv4.method nmcli device 重点nmcli d connect ethXnmcli d disconnect ethXnmcli d reapply ethX 网络接口手工配置使用nmcli配置直接修改配置文件 NetworkManager Network…

Linux下联网配置

Linux下联网配置 在Linux下通常我们会用到yum源&#xff0c;yum源的使用需要联网&#xff0c;话不多说&#xff0c;直接操作。 1.首先我们打开VMware&#xff0c;点击编辑&#xff0c;在编辑中点击虚拟网络编辑器。 2.点击虚拟网络编辑器后&#xff0c;看到下图&#xff1a;点…

linux redhat联网

关于虚拟机连接外网的桥接几个简单步骤 打开虚拟机>>编辑>>虚拟网络编辑器 打开后看到几个虚拟网卡&#xff0c;默认是VMnet0&#xff0c;这里大家可以选择固定的网卡进行配置&#xff0c;我用默认&#xff0c;我使用的是无线网卡Intel(R) Wireless-AC 9560..完成…