Neon FFT 测试

/*
* Name: fft-test.c
* Description: neon fft test
* Author: Ryuk
* Date: 04/05/2021
*/

#include <stdio.h>
#include <string.h>

#include "NE10.h"

#define DEBUG       (0)
#define WAV         (1)
#define FRAME_SIZE  (64)
#define INT_16      (32768)

int main()
{
    char inFileName[512];
    char outFileName[512];
    
    short input[FRAME_SIZE];
    short output[FRAME_SIZE];

    FILE *in;
    FILE *out;

#if WAV
    sprintf(inFileName, "%s", "../sample/fft-test.wav");
    sprintf(outFileName, "%s", "../sample/output.wav");
#else
    sprintf(inFileName, "%s", "../sample/fft-test.pcm");
    sprintf(outFileName, "%s", "../sample/output.pcm");
#endif

    printf("Open %s\n", inFileName);
    in = fopen(inFileName, "rb");
    if(in == NULL)
    {
        perror("Error: ");
        return -1;
    }

    printf("Open %s\n", outFileName);
    out = fopen(outFileName, "wb");
    if(out == NULL)
    {
        perror("Error: ");
        return -1;
    }

#if WAV
    fread(input, 44, sizeof(short), in);
    fwrite(input, 44, sizeof(short), out);   
#endif

    int nfft = FRAME_SIZE;
    float *inData = (float *)calloc(FRAME_SIZE, sizeof(float));
    float *outData = (float *)calloc(FRAME_SIZE + 2, sizeof(float));

    ne10_fft_cfg_float32_t cfg;
    cfg = ne10_fft_alloc_r2c_float32(nfft);

    while(fread(input, FRAME_SIZE, sizeof(short), in))
    {   
        memset(inData, 0, sizeof(inData));
        memset(outData, 0, sizeof(outData));

#if DEBUG
        printf("Before FFT\n");
        for(int i=0; i<FRAME_SIZE; i++)
        {
            printf("%d\t", input[i]);
        }
        printf("\n");
#endif       

        for(int i=0; i<FRAME_SIZE; i++)
        {
            inData[i] = (float)(input[i]) / INT_16;
        }

        ne10_fft_r2c_1d_float32_neon(outData, inData, cfg);

#if DEBUG
        printf("After FFT\n");
        for(int i=0; i<FRAME_SIZE+2; i++)
        {
            printf("%d:%f\t", i, outData[i]);
        }
        printf("\n");
#endif

        ne10_fft_c2r_1d_float32_neon(inData, outData, cfg);

#if DEBUG
        printf("After IFFT\n");
        for(int i=0; i<FRAME_SIZE; i++)
        {
            output[i] = (short)(inData[i] * INT_16);
            printf("%d\t", output[i]);
        }
        printf("\n");
#endif
        fwrite(output, FRAME_SIZE, sizeof(short), out);
    }

    free(inData);
    free(outData);
    ne10_fft_destroy_r2c_float32(cfg);

    fclose(in);
    fclose(out);
    
    printf("Program Finished\n");
    return 0;
}

根据API文档可以发现,FFT的输出要比输入多两个位置,因此总共输出为直流分量、各频率分量和奈奎斯特分量,总维数为(nfft / 2)+1

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值