硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2479|回复: 8
收起左侧

[技术讨论] DSP FFT教程里说第N个点的频率是N-1,怎么理解?

[复制链接]

11

主题

30

回帖

63

积分

初级会员

积分
63
发表于 2019-6-21 22:30:59 | 显示全部楼层 |阅读模式
硬汉举了几个例子. 比如50HZ 出现在51点上,75HZ 出现在76个点上.还例举了公式Fn =(n − 1)xFs/N


我仿真出来的结果75HZ 的峰值就出现在第75个点, 变成FFT 出来的结果是74HZ了?

int32_t main(void)
{
  uint16_t i;
  arm_status status;
  float32_t maxValue;

  status = ARM_MATH_SUCCESS;


for(i=0; i<1024; i++)
{

        testInput_f32_10khz[i*2+1] = 0;
//50hz   1000hz
        testInput_f32_10khz[i*2] = arm_sin_f32(2*3.1415926f*75*i/1024);
}


  /* Process the data through the CFFT/CIFFT module */
  arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

  /* Process the data through the Complex Magnitude Module for
  calculating the magnitude at each bin */
  arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);

  /* Calculates maxValue and returns corresponding BIN value */
  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);



回复

使用道具 举报

11

主题

30

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2019-6-21 22:32:17 | 显示全部楼层
fn.png

2019-6-21 21-50-14.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107072
QQ
发表于 2019-6-21 22:44:56 | 显示全部楼层
是FFT采样点的问题,你可以生成2048个1024Hz的采样率采用波形,这样分辨率就是0.5Hz了,再准确些采样4096点。这样评估就更准确了。
回复

使用道具 举报

11

主题

30

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2019-6-22 10:41:02 | 显示全部楼层
eric2013 发表于 2019-6-21 22:44
是FFT采样点的问题,你可以生成2048个1024Hz的采样率采用波形,这样分辨率就是0.5Hz了,再准确些采样4096点 ...

谢谢回复。
我现在是用一路PWM输出5K的方波,这个方波经过LC滤为正弦波。 然后我想对5K正弦做FFT求出相位和幅度。
我的初步设想是 用5k*1024的采样频率,将200us/1024 等份,用一个定时器假设为timer1每隔200us/1024去触发一次adc转换并DMA搬运。 这个timer1用PWM波的上升或下降沿来启动,在一个5K周期内做1024点FFT。
请问这样可行吗? 你有什么好的建议吗? 对于5K的信号多少的FS会比较好呢。
回复

使用道具 举报

11

主题

30

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2019-6-23 12:02:54 | 显示全部楼层
自己顶下,做过的坛友给点建议啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107072
QQ
发表于 2019-6-23 12:05:41 | 显示全部楼层
ZXB 发表于 2019-6-22 10:41
谢谢回复。
我现在是用一路PWM输出5K的方波,这个方波经过LC滤为正弦波。 然后我想对5K正弦做FFT求出相 ...

软件上没问题。看我一代示波器即可,最高值8.4Msps。
回复

使用道具 举报

11

主题

30

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2019-6-23 12:19:28 | 显示全部楼层
我在想一个问题,因为我的目的是获取已知频率的相位和幅度.   假设这个频率有可能受温度等外在原因的影响在4.9~5k之间变化,  那么我是不是每次做FFT变换后都要先找出数组最大幅度的index ,认为这个数组单元即是我要的5K信号所在(这个数组有可能在N  +/- 1) 然后以这个数组单元来求相位呢.
回复

使用道具 举报

11

主题

30

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2019-6-23 12:25:08 | 显示全部楼层
换句话说,如果在调试的时候观察到5K信号是出现在  FFT_OUT[N],  然后程序里就固定 以N这个数组单元来求相位.   但是一旦5K信号一旦产生一点点的频偏是不是就获取出错了.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107072
QQ
发表于 2019-6-23 12:31:43 | 显示全部楼层
ZXB 发表于 2019-6-23 12:25
换句话说,如果在调试的时候观察到5K信号是出现在  FFT_OUT[N],  然后程序里就固定 以N这个数组单元来求相位 ...

FFT频率估计就是这样的。只能估算一个范围,更专业,更准确的算法需要你去研究了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 13:57 , Processed in 0.286555 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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