OpenEdv-开源电子网

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

为什么F407做FFT之后,求相位,相位值一直在变

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-8-8
在线时间
27 小时
发表于 2019-12-25 16:33:24 | 显示全部楼层 |阅读模式
1金钱
利用内部adc采集交流信号,然后做用dsp的库做fft之后求相位,相位值一直在变是什么问题

最佳答案

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

因为你采样的参考点每次不一样的,而我们通常说的相位是对0点的值,所以是会不一样的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
金钱
429
注册时间
2019-5-15
在线时间
52 小时
发表于 2019-12-25 16:33:25 | 显示全部楼层
因为你采样的参考点每次不一样的,而我们通常说的相位是对0点的值,所以是会不一样的。
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-8-8
在线时间
27 小时
 楼主| 发表于 2019-12-25 16:38:34 | 显示全部楼层
这个是求相位部分的代码
  1. #define pi 3.1415926f
  2. #define FFT_LENGTH 4096

  3. float fft_inputbuf[FFT_LENGTH*2];        //FFT输入数组 计算采样电阻前的电压
  4. float fft_outputbuf[FFT_LENGTH];        //FFT输出数组


  5. float FFT_ADC(u8 ch,u8 mode)
  6. {
  7.                 float ADC_temp;
  8.                 float max;
  9.                 int max2;
  10.                 float v_ac;
  11.                 float v_dc;
  12.                 float phase;//相位
  13.                 double real,im;
  14.                 float hudu;
  15.                 u16 i;

  16.                         while(!adc_flag)
  17.                         {
  18.                         }
  19.                                 TIM_Cmd(TIM3,ENABLE);
  20.                                 adc_flag=0;
  21.                           max=0;
  22.                                 for(i=0;i<FFT_LENGTH;i++)
  23.                                 {
  24.                                         ADC_temp=(float)ADC1data[ch][i]*(3.3f/4095.0f);
  25.                                         fft_inputbuf[2*i]=ADC_temp;//高位放置实数  1010 0000
  26.                                         fft_inputbuf[2*i+1]=0;//低位放置虚数       
  27.                                 }
  28.                                 arm_cfft_f32(&arm_cfft_sR_f32_len4096,fft_inputbuf,0,1);
  29.                                 arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);          //FFT计算(基4)               

  30.                                 for(i=0;i<(FFT_LENGTH/2+1);i++)
  31.                                 {  
  32.                                         if(max < fft_outputbuf[i+2])       
  33.                                         {
  34.                                                  max = fft_outputbuf[i+2];        //找fftout的最大值
  35.                                                  max2=i+2;
  36.                                         }
  37.                                 }
  38.                                 if(mode==1)
  39.                                 {                                                               
  40.                                
  41.                                         v_ac = (max/FFT_LENGTH)*2.308834f;
  42.                                         return v_ac;
  43.                                 }
  44.                          else if(mode==2)
  45.                                 {
  46.                                         v_dc =  (fft_outputbuf[0]/FFT_LENGTH);
  47.                                         return v_dc;
  48.                                 }       
  49.                         else
  50.                                 {
  51.                                         real=(double)fft_inputbuf[2*max2];
  52.                                         im=(double)fft_inputbuf[2*max2+1];
  53.                                         hudu=atan2(im,real);
  54.                                         phase=hudu*180.0f/pi;
  55.                                         if(phase<0)
  56.                                                 phase+=360.0f;
  57.                         //                phase= atan2((double)fft_inputbuf[2*max2+1],(double)fft_inputbuf[2*max2])*180.0/pi;
  58.                                         return phase;
  59.                                 }                                                       
  60. }
复制代码

回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-8-8
在线时间
27 小时
 楼主| 发表于 2019-12-25 16:40:20 | 显示全部楼层
这里是在主函数里做的显示
  1.                 while(1)
  2.                 {
  3.                         //ctp_test();
  4.                         jiaodu=FFT_ADC(1,3);
  5.                         sprintf((char*)dd,"jiaodu=%f",jiaodu);
  6.                         LCD_ShowString(400,200,200,24,24,dd);       
  7.                         delay_ms(1000);
  8.                 }       
复制代码
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-12-25 20:55:12 | 显示全部楼层
相位变是正常的

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-26 02:06:13 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-8-8
在线时间
27 小时
 楼主| 发表于 2019-12-27 21:42:57 | 显示全部楼层

我想检测一个信号经过一个放大电路的相位差,是不是两个两个相位相减的值是不变的
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-7-16
在线时间
3 小时
发表于 2020-1-4 19:13:49 | 显示全部楼层

你确定吗

回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-1-20 15:57:09 | 显示全部楼层

这个世界不存两个完全一样的信号, 频率些许的差别, 就自然产生相位差, 这有什么需要怀疑的啊
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-6-6
在线时间
18 小时
发表于 2020-3-14 23:07:29 | 显示全部楼层
楼主,最近再学习这个,能发份源码给我参考下吗,谢谢 391588997@qq.com
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2020-6-10 14:34:43 | 显示全部楼层
楼主问题解决了么?我的也是一直在变
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2022-7-29
在线时间
1 小时
发表于 2022-8-29 08:29:17 | 显示全部楼层
楼主问题解决了吗,我的也是一直在变,不断递减
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2021-3-4
在线时间
28 小时
发表于 2023-3-4 21:39:51 | 显示全部楼层
yimengxiaoyao 发表于 2019-12-27 21:42
我想检测一个信号经过一个放大电路的相位差,是不是两个两个相位相减的值是不变的

你好,我最近也需要求两个相位差,请问你解决了吗,416341641,可以交流下吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 17:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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