世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

(PSIM仿真)教你快速玩转傅立叶变换

[复制链接]
查看: 6765 |回复: 36
1
闪烁
  • 积分:17339
  • |
  • 主题:39
  • |
  • 帖子:1023
积分:17339
版主
  • 2019-5-13 20:21:29
         FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
       虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。
       采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。
假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的 幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点 N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被 N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:。由上面的公式可以看出,Fn所能分辨到频率为 Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是,相位就是。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:,即。对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。
       上面说了一大堆,可能是越看越模糊,接下来我们通过PSIM仿真来做一下简单的讲解;

FFT变换的实际意义.doc

36.5 KB, 下载次数: 23, 下载积分: 财富 -2

售价: 5 财富  [记录]

评分

参与人数 1财富 +10收起理由
lyp_204 + 10

查看全部评分

闪烁
  • 积分:17339
  • |
  • 主题:39
  • |
  • 帖子:1023
积分:17339
版主
  • 2019-5-13 20:33:59
 
/*********************************************************************
                         快速傅利叶变换C函数
函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依
         赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复
         数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的
         复数
使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的
         应该为2的N次方,不满足此条件时应在后面补0
函数调用:FFT(s);
版    本:Ver1.0
**********************************************************************/
#include<math.h>

#define PI3.1415926535897932384626433832795028841971               //定义圆周率值
#define FFT_N 128                                                  //定义福利叶变换的点数

struct compx {float real,imag;};                                    //定义一个复数结构
struct compx s[FFT_N];                                             //FFT输入和输出:从S[1]开始存放,根据大小自己定义


/*******************************************************************
函数原型:struct compxEE(struct compx b1,struct compx b2)  
函数功能:对两个复数进行乘法运算
输入参数:两个以联合体定义的复数a,b
输出参数:a和b的乘积,以联合体的形式输出
*******************************************************************/
struct compx EE(struct compx a,struct compxb)      
{
struct compx c;
c.real=a.real*b.real-a.imag*b.imag;
c.imag=a.real*b.imag+a.imag*b.real;
return(c);
}

/*****************************************************************
函数原型:void FFT(structcompx *xin,int N)
函数功能:对输入的复数组进行快速傅里叶变换(FFT)
输入参数:*xin复数结构体组的首地址指针,struct型
*****************************************************************/
void FFT(struct compx *xin)
{
  intf,m,nv2,nm1,i,k,l,j=0;
struct compx u,w,t;

  nv2=FFT_N/2;                  //变址运算,即把自然顺序变成倒位序,采用雷德算法
  nm1=FFT_N-1;  
  for(i=0;i<nm1;i++)        
   {
   if(i<j)                    //如果i<j,即进行变址
    {
     t=xin[j];           
     xin[j]=xin[i];
     xin[i]=t;
    }
   k=nv2;                    //求j的下一个倒位序
   while(k<=j)               //如果k<=j,表示j的最高位为1   
    {           
     j=j-k;                 //把最高位变成0
     k=k/2;                 //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
    }
  j=j+k;                   //把0改为1
  }

  {
  int le,lei,ip;                           //FFT运算核,使用蝶形运算完成FFT运算
   f=FFT_N;
  for(l=1;(f=f/2)!=1;l++)                 //计算l的值,即计算蝶形级数
          ;
for(m=1;m<=l;m++)                         // 控制蝶形结级数
  {                                       //m表示第m级蝶形,l为蝶形级总数l=log(2)N
   le=2<<(m-1);                            //le蝶形结距离,即第m级蝶形的蝶形结相距le点
   lei=le/2;                              //同一蝶形结中参加运算的两点的距离
   u.real=1.0;                            //u为蝶形结运算系数,初始值为1
   u.imag=0.0;
   w.real=cos(PI/lei);                    //w为系数商,即当前系数与前一个系数的商
   w.imag=-sin(PI/lei);
   for(j=0;j<=lei-1;j++)                   //控制计算不同种蝶形结,即计算系数不同的蝶形结
    {
     for(i=j;i<=FFT_N-1;i=i+le)           //控制同一蝶形结运算,即计算系数相同蝶形结
      {
       ip=i+lei;                           //i,ip分别表示参加蝶形运算的两个节点
       t=EE(xin[ip],u);                   //蝶形运算,详见公式
       xin[ip].real=xin[i].real-t.real;
       xin[ip].imag=xin[i].imag-t.imag;
       xin[i].real=xin[i].real+t.real;
       xin[i].imag=xin[i].imag+t.imag;
       }
     u=EE(u,w);                          //改变系数,进行下一个蝶形运算
    }
   }
  }

}

/************************************************************
函数原型:void main()
函数功能:测试FFT变换,演示函数使用方法
输入参数:无
输出参数:无
************************************************************/
void main()   
{  
  inti;
for(i=0;i<FFT_N;i++)                           //给结构体赋值
  {
    s[i].real=sin(2*3.141592653589793*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1
    s[i].imag=0;                                //虚部为0
  }

FFT(s);                                        //进行快速福利叶变换

for(i=0;i<FFT_N;i++)                           //求变换后结果的模值,存入复数的实部部分
s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);

  while(1);
}

C语言实现FFT(快速傅里叶变换).pdf

85.39 KB, 下载次数: 21, 下载积分: 财富 -2

售价: 5 财富  [记录]

闪烁
  • 积分:17339
  • |
  • 主题:39
  • |
  • 帖子:1023
积分:17339
版主
  • 2019-5-13 21:12:09
 
首先从网上下载快速傅利叶变换C函数,如上楼;
然后将C函数,复制到PSIM软件C Block模块,进行编译;




从代码注释我们知道数组s[test].real存放的是每个频率段的信号的模值,也就是我们的基波信号是50Hz,那么s[1].real存放的是50Hz的信号的模值,s[2].real存放的是100Hz的信号的模值,s[3].real存放的是150Hz的信号的模值,s[4].real存放的是200Hz的信号的模值,以此类推;

接下来直接通过仿真数据在验证:
实验一:直接给定10V50Hz的信号进行傅里叶变换;
理论分析:由于只有50Hz的信号,那么s[1].real=10,其他应该等于0;


实验二:复合信号10V50Hz、20V100Hz、30V150Hz三个信号进行叠加进行傅里叶变换;
理论分析:输入信号是一个含多种频率的信号,进行FFT后,特定信号的模值应该被提取出来;



从上面仿真数据可以看出来,对于复杂的信号,进行傅里叶变之后,我们能得到对应频率的信号的模值,这样对于我们分析连续域的信号非常的有帮助;
另一方面,我们也可以看到PSIM软件自带的C Block模块对于我们软件开发人员是一大神器,可以非常方便的去帮助我们去验证算法的可行性和正确性;









傅里叶变换.rar

741.09 KB, 下载次数: 60, 下载积分: 财富 -2

售价: 10 财富  [记录]

hm492464387
  • 积分:769
  • |
  • 主题:2
  • |
  • 帖子:27
积分:769
LV6
高级工程师
  • 2019-5-13 21:31:36
 
兄弟太厉害了。
卫庄
  • 积分:131
  • |
  • 主题:0
  • |
  • 帖子:7
积分:131
LV2
本网技师
  • 2019-5-23 17:08:15
 
多谢分享
贤阁主
  • 积分:1314
  • |
  • 主题:2
  • |
  • 帖子:50
积分:1314
LV6
高级工程师
  • 2019-5-28 09:19:53
 
打卡,学习
爱神游的音乐君
  • 积分:79
  • |
  • 主题:0
  • |
  • 帖子:9
积分:79
LV1
本网技工
  • 2019-6-25 14:14:45
 
学习学习

爱神游的音乐君
  • 积分:79
  • |
  • 主题:0
  • |
  • 帖子:9
积分:79
LV1
本网技工
  • 2019-6-25 14:33:05
 
楼主,这样仿真看不到频率点啊
cedar2010
  • 积分:578
  • |
  • 主题:1
  • |
  • 帖子:16
积分:578
LV6
高级工程师
  • 2019-8-5 16:05:58
 
很好的帖子!就是财富值有点儿高
bywind
  • bywind
  • 离线
  • LV6
  • 高级工程师
  • 积分:1097
  • |
  • 主题:2
  • |
  • 帖子:121
积分:1097
LV6
高级工程师
  • 2019-11-18 20:19:40
 
同意
bywind
  • bywind
  • 离线
  • LV6
  • 高级工程师
  • 积分:1097
  • |
  • 主题:2
  • |
  • 帖子:121
积分:1097
LV6
高级工程师
  • 2019-11-18 20:20:56
 
不过,还是要十分感谢楼主
bywind
  • bywind
  • 离线
  • LV6
  • 高级工程师
  • 积分:1097
  • |
  • 主题:2
  • |
  • 帖子:121
积分:1097
LV6
高级工程师
  • 2019-11-18 20:13:39
 
楼主强大,谢谢,学习学习
wanlii
  • wanlii
  • 离线
  • LV6
  • 高级工程师
  • 积分:438
  • |
  • 主题:12
  • |
  • 帖子:68
积分:438
LV6
高级工程师
  • 2020-1-14 10:31:06
 
值得分享,谢谢楼主
CHINA999
  • 积分:122
  • |
  • 主题:0
  • |
  • 帖子:4
积分:122
LV2
本网技师
  • 2020-4-1 10:27:01
  • 倒数6
 
这个压缩包怎么下载不了呢,麻烦你发我一下邮箱,谢谢,我已经买过了。599540970@qq.com
zst588
  • zst588
  • 离线
  • LV6
  • 高级工程师
  • 积分:464
  • |
  • 主题:2
  • |
  • 帖子:114
积分:464
LV6
高级工程师
  • 2020-4-1 13:01:15
  • 倒数4
 
很好!很强大!谢谢楼主分享!
文武68
  • 积分:161
  • |
  • 主题:0
  • |
  • 帖子:41
积分:161
LV2
本网技师
  • 2019-5-15 12:36:25
 
老哥你太6了
anfe09
  • anfe09
  • 离线
  • LV6
  • 高级工程师
  • 积分:462
  • |
  • 主题:0
  • |
  • 帖子:23
积分:462
LV6
高级工程师
  • 2019-5-17 14:36:21
 
还有这个,最近在看傅里叶变换正好学习一下,楼主棒棒的。
zst588
  • zst588
  • 离线
  • LV6
  • 高级工程师
  • 积分:464
  • |
  • 主题:2
  • |
  • 帖子:114
积分:464
LV6
高级工程师
  • 2019-5-29 10:30:55
 
很好,很强大!谢谢楼主分享!
爱神游的音乐君
  • 积分:79
  • |
  • 主题:0
  • |
  • 帖子:9
积分:79
LV1
本网技工
  • 2019-6-25 14:15:27
 
就是财富值不够,不好下载附件啊!!
清秋梧桐
  • 积分:273
  • |
  • 主题:0
  • |
  • 帖子:41
积分:273
LV3
助理工程师
  • 2019-7-11 16:12:40
 
学习一下
清秋梧桐
  • 积分:273
  • |
  • 主题:0
  • |
  • 帖子:41
积分:273
LV3
助理工程师
  • 2019-7-13 14:14:55
 
可以的哈
kaisachaoren
  • 积分:402
  • |
  • 主题:2
  • |
  • 帖子:38
积分:402
LV6
高级工程师
  • 2019-10-3 16:31:40
 
PSIM没有自带的傅里叶变换模块吗?
硬件研发工程师
  • 积分:764
  • |
  • 主题:0
  • |
  • 帖子:134
积分:764
LV6
高级工程师
  • 2019-11-2 14:08:05
 
前辈很厉害,是个牛人。
yiwang572
  • 积分:596
  • |
  • 主题:11
  • |
  • 帖子:64
积分:596
LV6
高级工程师
  • 2019-11-23 13:54:12
 
打卡,学习
airuoyao
  • 积分:247
  • |
  • 主题:4
  • |
  • 帖子:30
积分:247
LV3
助理工程师
  • 2019-12-4 19:47:15
 
初入光伏行业,感谢分享,
ddrgo
  • ddrgo
  • 离线
  • LV3
  • 助理工程师
  • 积分:222
  • |
  • 主题:0
  • |
  • 帖子:16
积分:222
LV3
助理工程师
  • 2019-12-27 15:33:18
 
楼主威武
chair2020
  • 积分:302
  • |
  • 主题:0
  • |
  • 帖子:35
积分:302
LV4
初级工程师
  • 2020-1-1 10:07:38
 
谢谢
合味道
  • 积分:199
  • |
  • 主题:1
  • |
  • 帖子:29
积分:199
LV2
本网技师
  • 2020-2-22 00:39:08
 
感谢分享
lqc779
  • 积分:169
  • |
  • 主题:0
  • |
  • 帖子:15
积分:169
LV2
本网技师
  • 2020-3-2 10:46:29
 
谢谢分享
zsqlaoer1
  • 积分:299
  • |
  • 主题:0
  • |
  • 帖子:53
积分:299
LV3
助理工程师
  • 2020-3-7 03:11:15
  • 倒数10
 
兄弟太厉害了
zhxy_hz
  • 积分:199
  • |
  • 主题:0
  • |
  • 帖子:21
积分:199
LV2
本网技师
  • 2020-3-20 08:24:18
  • 倒数9
 
相当强大,相当有助FFT的学习和认知。
luooul
  • 积分:193
  • |
  • 主题:0
  • |
  • 帖子:13
积分:193
LV2
本网技师
  • 2020-3-29 16:51:23
  • 倒数8
 
谢谢分享
CHINA999
  • 积分:122
  • |
  • 主题:0
  • |
  • 帖子:4
积分:122
LV2
本网技师
  • 2020-4-1 10:24:01
  • 倒数7
 
感谢博主的分享
zst588
  • zst588
  • 离线
  • LV6
  • 高级工程师
  • 积分:464
  • |
  • 主题:2
  • |
  • 帖子:114
积分:464
LV6
高级工程师
  • 2020-4-1 13:00:04
  • 倒数5
 
很好,很强大!谢谢楼主分享!
linhainpu
  • 积分:346
  • |
  • 主题:1
  • |
  • 帖子:76
积分:346
LV4
初级工程师
  • 2020-5-9 08:20:49
  • 倒数3
 
跟着高手学习
linhainpu
  • 积分:346
  • |
  • 主题:1
  • |
  • 帖子:76
积分:346
LV4
初级工程师
  • 2020-5-9 09:25:28
  • 倒数2
 
顶起 不错
linhainpu
  • 积分:346
  • |
  • 主题:1
  • |
  • 帖子:76
积分:346
LV4
初级工程师
最新回复
  • 2020-5-9 09:27:06
  • 倒数1
 
下载了,认真学习一下
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦5层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan。com(#换成@)

世纪电源网分部

广 东:(0755)28285637 /(13823562357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 |

Copyright 2008-2020 liuxuesk.com All Rights Reserved    备案许可证号为:津ICP备10002348

秒速时时彩开奖 秒速时时彩官网 秒速时时彩 北京赛车论坛 吉林快3开奖 秒速时时彩开奖 江苏快3 秒速时时彩 秒速时时彩平台 秒速时时彩