硬汉嵌入式论坛

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

[DSP] 关于V5开发板 实数FFT例程的问题

[复制链接]

4

主题

30

回帖

42

积分

新手上路

积分
42
发表于 2016-10-21 15:44:20 | 显示全部楼层 |阅读模式
关于V5开发板 实数FFT例程的问题:由于自己对FFT不了解 之前没有接触过,问的问题可能比较低级。。。。 别见笑
/*
*********************************************************************************************************
*    函 数 名: arm_rfft_fast_f32_app
*    功能说明: 调用函数arm_rfft_fast_f32计算1024点实数序列的幅频响应并跟使用函数arm_cfft_f32计算的结果做对比。
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void arm_rfft_fast_f32_app(void)
{
    uint16_t i;
    arm_rfft_fast_instance_f32 S;

    /* 实数序列FFT长度 */
    fftSize = 1024;
    /* 正变换 */
    ifftFlag = 0;

    /* 初始化结构体S中的参数 */
     arm_rfft_fast_init_f32(&S, fftSize);

    /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
    for(i=0; i<1024; i++)
    {
        /* 50Hz正弦波,采样率1KHz */
        testInput_f32_10khz = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;
    }

    /* 1024点实序列快速FFT */
    arm_rfft_fast_f32(&S, testInput_f32_10khz, testOutput_f32_10khz, ifftFlag);

    /* 为了方便跟函数arm_cfft_f32计算的结果做对比,这里求解了1024组模值,实际函数arm_rfft_fast_f32
       只求解出了512组  
    */
     arm_cmplx_mag_f32(testOutput_f32_10khz, testOutput, fftSize);

    /* 串口打印求解的模值 */
    for(i=0; i<fftSize; i++)
    {
        printf("%f\r\n", testOutput);
    }

    printf("****************************分割线***************************************\r\n");

    for(i=0; i<1024; i++)
    {
        /* 虚部全部置零 */
        testInput_f32_10khz[i*2+1] = 0;

        /* 50Hz正弦波,采样率1KHz ,作为实部 */
        testInput_f32_10khz[i*2] = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;
    }

    arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

    /* 求解模值  */
     arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);

    /* 串口打印求解的模值 */
    for(i=0; i<fftSize; i++)
    {
        printf("%f\r\n", testOutput);
    }

}

问题1:
在调用了 以下语句之后
    /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
    for(i=0; i<1024; i++)
    {
        /* 50Hz正弦波,采样率1KHz */
        testInput_f32_10khz = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;
    }
testInput_f32_10khz数组的排列是 testInput_f32_10khz[0]实部,testInput_f32_10khz[1]虚部。。。。。。。。。。。testInput_f32_10khz[1022]实部,testInput_f32_10khz[1023]虚部 这样吗?
这得到了一个复数形式的数组 对吗?

问题2:如果上面得到的数组是复数形式,那么arm_rfft_fast_f32进行的是实数的FFT ,那么 这样子有没有冲突?


问题3:在运行arm_rfft_fast_f32(&S, testInput_f32_10khz, testOutput_f32_10khz, ifftFlag);之后,
会发现testInput_f32_10khz数组的值跟运行函数arm_rfft_fast_f32前是有变化的,
同时 testOutput_f32_10khz也有数据了。这个时候,两者之间的关系是怎么样的,FFT后,输入信号的实数部分和虚数部分都在 testOutput_f32_10khz能反应出来吗

那这个实数和虚数 跟testInput_f32_10khz[i*2] = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;所产生的实部和虚部又有什么区别?
本身如果testInput_f32_10khz[i*2] = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;已经产生了实数+虚数的数据的情况下!

谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2016-10-21 16:05:32 | 显示全部楼层
1. 这个不是,注释有误,直接复制粘贴的,忘了修改。
2. 实数FFT的虚部按照0来计算的,计算出来的结果还是个复数。
3. 不用管testInput_f32_10khz,输出的实部和虚部都在testOutput_f32_10khz里面
4. fft前是时域信号,fft后是频域信号。
回复

使用道具 举报

4

主题

30

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2016-10-24 10:33:41 | 显示全部楼层
谢谢!另外 如何解析一下 下面的在Cortex-M4硬件实际运行FFT的结果:
1、sample_data = 1.2f*arm_sin_f32(2*3.1415926f*50*i/256)+1;------------------------采样占用率为256,采点为256个点
函数产生正弦波值sample_data.png
想确认:运行sample_data = 1.2f*arm_sin_f32(2*3.1415926f*50*i/256)+1;后,得到的数都是实数部分吗?实数FFT虚数为零,在实际的实数FFT进行前
需要不需要先做数据处理把sample_data数组长度放大一倍,然后偶数位置不变,奇数位置 为0?还是就直接把sample_data = 1.2f*arm_sin_f32(2*3.1415926f*50*i/256)+1;
得到的sample_data直接做为实数FFT的数据源就好?

2、调用实数FFT函数arm_rfft_fast_f32(&aa,sample_data,out_data,0);后得到的结果
函数产生正弦波值FFT后sample_data.png    sample_data(源数组)
函数产生正弦波值FFT后sample_data_out.png    out_data(转换结果)
其中,sample_data(源数组)  out_data为目标数组,前面 sample_data【0】--128和
sample_data【1】--128  out_data【0】--256和out_data【1】--0,这前面的2个字节分别表示的是什么意思?从out_data【2】开始 就是 out_data【2】实数部分+out_data【3】虚数部分。。。。。。。。。。。一直这样
栗排列下去吗

另外,调用实数FFT函数arm_rfft_fast_f32(&aa,sample_data,out_data,0);后,256个点的输入源 就变成了 128点的复数描述形式吗?out_data【2】----------第1点的实部部分    out_data【3】-----------第1点的虚部部分。。。。。。。。。。。。。。直到 out_data【254】------第127点的实部部分+ out_data【255】------第127点的虚部部分,  256个点的输入源得到的结果的描述相当于只有256/2-1个复数(实部+虚部)的描述?  这样子理解是正确的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2016-10-24 11:44:50 | 显示全部楼层

回 gdgn_526345 的帖子

gdgn_526345:谢谢!另外 如何解析一下 下面的在Cortex-M4硬件实际运行FFT的结果:
1、sample_data = 1.2f*arm_sin_f32(2*3.1415926f*50*i/256)+1;------------------------采样占用率为256,采点为256个点

想确认:运行sample_data = 1.2f*arm_sin_f32(2*3.1415926f*50*i/ .. (2016-10-24 10:33) 
1. 直接使用就好了。
2. 输入不用管,就看输出。排列就是实部,虚部,实部,虚部,实部,虚部,实部,虚部,。。
从out_data[0]开始。
3. 其实你应该先学习复数FFT,实数FFT的输出结果仅输出了一半,另一半是对称的没有输出,学习下matlab的操作就更明白了。
回复

使用道具 举报

4

主题

30

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2016-10-24 18:03:40 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 直接使用就好了。
2. 输入不用管,就看输出。排列就是实部,虚部,实部,虚部,实部,虚部,实部,虚部,。。
从out_data[0]开始。
3. 其实你应该先学习复数FFT,实数FFT的输出结果仅输出了一半,另一半是对称的没有输出,学习下matlab的操作就更明白了。 (2016-10-24 11:44) 
好的!谢谢!非常感谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 02:22 , Processed in 0.228079 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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