OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10371|回复: 9

两路正弦波信号通过ADC采集信号进行FFT计算,怎么利用dsp库的FFT程序计算啊

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-18
在线时间
1 小时
发表于 2015-5-24 21:35:01 | 显示全部楼层 |阅读模式
5金钱
想测量两个正弦波的相位差,目前正弦信号已用ADC+DMAl两路通道采集到了正弦信号,接下来怎么利用怎么利用dsp库的FFT程序计算两个正弦波的幅值,实部,虚部,相位差啊,有哪位大神有没有FFT计算相关的例子程序啊,非常感谢!

最佳答案

查看完整内容[请看2#楼]

做过的东西: g_DSO为结构体,下面为它的部分成员,_usFFTPoints为点数(64/256/1024)  uint32_t FFTIN [1024]; uint32_t FFTOUT[1024]; uint16_t FFTMAG[512]; uint32_t FFTPHASE[512]; cr4_fft_1024_stm32(g_DSO.FFTOUT,g_DSO.FFTIN,_usFFTPoints); /****************************************************************************************** * 每个单元数据高字(高16位)中存储采样数据的实部,低 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2015-5-24 21:35:02 | 显示全部楼层
做过的东西:
g_DSO为结构体,下面为它的部分成员,_usFFTPoints为点数(64/256/1024) 
uint32_t FFTIN [1024];
uint32_t FFTOUT[1024];
uint16_t FFTMAG[512];
uint32_t FFTPHASE[512];

cr4_fft_1024_stm32(g_DSO.FFTOUT,g_DSO.FFTIN,_usFFTPoints);


/******************************************************************************************
* 每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)
* 进行FFT变换,并计算各次谐波相位
* The phase value is in the range [-pi: pi]. 
*******************************************************************************************/
void ower_Phase_Radians(uint16_t _usFFTPoints)
{
    int16_t lX,lY;
    uint16_t i;

    for (i=0; i <(_usFFTPoints >> 1); i++)
    {
        lX= (g_DSO.FFTOUT<<16)>>16; /* 虚部 取低16bit,sine_cosine --> cos */
        lY= (g_DSO.FFTOUT >> 16);   /* 实部 取高16bit,sine_cosine --> sin */    
        {
            float X = (float)lX;
            float Y = (float)lY;
            float phase = atan2(X,Y);
             if (X>0)
             {
//                if (X>=0);
//                  //phase+=PI2;
//                else
//                  phase+=PI;  
             }
             else
             {             
//                if (Y>=0)
//                  phase+=PI2;                  
//                else
// { 
//   phase = -phase;
                  phase+=PI2; 
// }                   
             }                   
            g_DSO.FFTPHASE = phase* 180.0/PI;
        }    
    }
}

/******************************************************************************************
* 每个单元数据高字(高16位)中存储采样数据的实部,低字(低16位)存储采样数据的虚部(总是为0)
* 进行FFT变换,并计算各次谐波幅值
*******************************************************************************************/
void owerMag(uint16_t _usFFTPoints)
{
int16_t lX,lY;
uint16_t i;

if(_usFFTPoints == 1024)
{
_usFFTPoints = 512; 
}
else if(_usFFTPoints == 256)
{
_usFFTPoints = 256;
}
else
{
_usFFTPoints = 64;
}

/* 计算幅值 */
for (i=0; i < _usFFTPoints; i++)
{
lX= (g_DSO.FFTOUT<<16)>>16;               /* sine_cosine --> cos */
lY= (g_DSO.FFTOUT>> 16);                  /* sine_cosine --> sin */    
{
//     float X=  1024*((float)lX)/32768;
//     float Y = 1024*((float)lY)/32768;
//     float Mag = sqrt(X*X+ Y*Y)/1024;  
float X= (float)lX/32;
float Y = (float)lY/32;
float Mag = sqrt(X*X+ Y*Y)/1024;
g_DSO.FFTMAG= (uint32_t)(Mag*65536);
}    
}
}
https://github.com/WZTENG
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2015-5-24 21:35:02 | 显示全部楼层
我也是从这个文档学到一些东西,自己往后找相关的内容,介绍的比较详细。(附件)

安富莱_STM32-V5开发板_数字信号处理教程(V1.0).pdf

16.7 MB, 下载次数: 8097

https://github.com/WZTENG
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-24 22:37:02 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-18
在线时间
1 小时
 楼主| 发表于 2015-5-25 10:21:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥!回复【2楼】正点原子:
---------------------------------
回复【2楼】正点原子:
---------------------------------
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-18
在线时间
1 小时
 楼主| 发表于 2015-5-25 16:19:59 | 显示全部楼层
回复【3楼】WZTENG:
---------------------------------
请问你有这个FFT计算有一整套的例程吗,可以发给我看看吗,不慎感激
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-18
在线时间
1 小时
 楼主| 发表于 2015-5-25 16:20:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-5-4
在线时间
2 小时
发表于 2015-5-26 09:24:33 | 显示全部楼层
回复【7楼】WZTENG:
---------------------------
同样的问题,有没有完整点的程序参考,谢谢
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2015-5-26 09:58:49 | 显示全部楼层
回复【8楼】luanshifusheng:
---------------------------------
这么好的资料还想怎么详细?
cr4_fft_1024_stm32(g_DSO.FFTOUT,g_DSO.FFTIN,_usFFTPoints);这个函数把参数传进去就行了。然后用上面的两个函数就可以得到幅值,相位,相位差自己把它们相减就行了,,,幅值是用勾股定理,相位用atan2();再不会就没有办法了。文档后面有专门的FFT函数介绍,慢慢悟。
https://github.com/WZTENG
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-18
在线时间
1 小时
 楼主| 发表于 2015-5-26 19:34:13 | 显示全部楼层
---
回复【9楼】WZTENG:
---------------------------------
非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表