31.1 复数FFT的逆变换实现 本小节主要讲解复数FFT的逆变换实现,通过函数arm_cfft_f32实现浮点数的逆变换。
31.1.1 arm_cfft_f32逆变换函数定义如下:
void arm_cfft_f32(
constarm_cfft_instance_f32 * S,
float32_t * p1,
uint8_tifftFlag,
uint8_tbitReverseFlag)
参数定义:
[in] *S points to an instance of the floating-point CFFT structure.
[in, out] *p1 points to the complex data buffer of size2*fftLen
. Processing
occurs in-place.
[in]ifftFlag flag that selects forward (ifftFlag=0) orinverse (ifftFlag=1) transform.
[in]bitReverseFlag flag that enables(bitReverseFlag=1) or disables (bitReverseFlag=0) bit
reversal of output.
注意事项:
结构const arm_cfft_instance_f32的定义如下(在文件arm_math.h文件):
typedefstruct
{
uint16_t fftLen;
constfloat32_t *pTwiddle;
constuint16_t *pBitRevTable;
uint16_t bitRevLength;
}arm_cfft_instance_f32;
下面通过函数arm_cfft_f32计算一个正弦波的FFT,然后再使用函数arm_cfft_f32做FFT逆变换,并使用 Matlab计算变换前后的结果对比。
- /*
- *********************************************************************************************************
- * 函 数 名: arm_cfft_f32_app
- * 功能说明: 调用函数arm_cfft_f32_app计算CFFT正变换和你变换。
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void arm_cfft_f32_app(void)
- {
- uint16_t i;
-
- fftSize = 1024;
- ifftFlag = 0;
- doBitReverse = 1;
-
- /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
- for(i=0; i<1024; i++)
- {
- testInput_f32_10khz[i*2+1] = 0;
-
- /* 50Hz正弦波,采样率1KHz */
- testInput_f32_10khz[i*2] = arm_sin_f32(2*3.1415926f*50*i/1000);
-
- printf("%frn", testInput_f32_10khz[i*2]);
- }
-
- /* CFFT变换:FFT正变换 */
- arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);
-
- ifftFlag = 1;
-
- /* CFFT变换:FFT逆变换 */
- arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);
-
- printf("****************************分割线***************************************rn");
- /* 串口打印求解的模值 */
- for(i=0; i<1024; i++)
- {
- printf("%frn", testInput_f32_10khz[i*2]);
- }
-
- }
运行如上函数可以通过串口打印出原始正弦波和经过CFFT,CIFFT的正弦波,下面我们就通过
Matlab对比变换前和变换后的波形。
对比前需要先将串口打印出的两组数据加载到Matlab中,并给原始正弦波起名signal,变换后的数组
起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:
- Fs = 1000; % 采样率
- N = 1024; % 采样点数
- n = 0:N-1; % 采样序列
- f = n * Fs / N; %真实的频率
-
- subplot(2,1,1);
- plot(f, signal); %绘制原始信号
- title('原始信号');
- xlabel('时间');
- ylabel('幅值');
-
- subplot(2,1,2);
- plot(f, sampledata); %绘制CFFT和CIFFT后的信号
- title('CFFT和CIFFT后的信号');
- xlabel('时间');
- ylabel('幅值');
Matlab运行的结果如下:
波形前端部分:
波形后端部分:
从上面的对比结果中可以看出,函数arm_cfft_f32计算前后的正弦波基本是一致的。
31.1 复数FFT的逆变换实现 本小节主要讲解复数FFT的逆变换实现,通过函数arm_cfft_f32实现浮点数的逆变换。
31.1.1 arm_cfft_f32逆变换函数定义如下:
void arm_cfft_f32(
constarm_cfft_instance_f32 * S,
float32_t * p1,
uint8_tifftFlag,
uint8_tbitReverseFlag)
参数定义:
[in] *S points to an instance of the floating-point CFFT structure.
[in, out] *p1 points to the complex data buffer of size2*fftLen
. Processing
occurs in-place.
[in]ifftFlag flag that selects forward (ifftFlag=0) orinverse (ifftFlag=1) transform.
[in]bitReverseFlag flag that enables(bitReverseFlag=1) or disables (bitReverseFlag=0) bit
reversal of output.
注意事项:
结构const arm_cfft_instance_f32的定义如下(在文件arm_math.h文件):
typedefstruct
{
uint16_t fftLen;
constfloat32_t *pTwiddle;
constuint16_t *pBitRevTable;
uint16_t bitRevLength;
}arm_cfft_instance_f32;
下面通过函数arm_cfft_f32计算一个正弦波的FFT,然后再使用函数arm_cfft_f32做FFT逆变换,并使用 Matlab计算变换前后的结果对比。
- /*
- *********************************************************************************************************
- * 函 数 名: arm_cfft_f32_app
- * 功能说明: 调用函数arm_cfft_f32_app计算CFFT正变换和你变换。
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void arm_cfft_f32_app(void)
- {
- uint16_t i;
-
- fftSize = 1024;
- ifftFlag = 0;
- doBitReverse = 1;
-
- /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
- for(i=0; i<1024; i++)
- {
- testInput_f32_10khz[i*2+1] = 0;
-
- /* 50Hz正弦波,采样率1KHz */
- testInput_f32_10khz[i*2] = arm_sin_f32(2*3.1415926f*50*i/1000);
-
- printf("%frn", testInput_f32_10khz[i*2]);
- }
-
- /* CFFT变换:FFT正变换 */
- arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);
-
- ifftFlag = 1;
-
- /* CFFT变换:FFT逆变换 */
- arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);
-
- printf("****************************分割线***************************************rn");
- /* 串口打印求解的模值 */
- for(i=0; i<1024; i++)
- {
- printf("%frn", testInput_f32_10khz[i*2]);
- }
-
- }
运行如上函数可以通过串口打印出原始正弦波和经过CFFT,CIFFT的正弦波,下面我们就通过
Matlab对比变换前和变换后的波形。
对比前需要先将串口打印出的两组数据加载到Matlab中,并给原始正弦波起名signal,变换后的数组
起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:
- Fs = 1000; % 采样率
- N = 1024; % 采样点数
- n = 0:N-1; % 采样序列
- f = n * Fs / N; %真实的频率
-
- subplot(2,1,1);
- plot(f, signal); %绘制原始信号
- title('原始信号');
- xlabel('时间');
- ylabel('幅值');
-
- subplot(2,1,2);
- plot(f, sampledata); %绘制CFFT和CIFFT后的信号
- title('CFFT和CIFFT后的信号');
- xlabel('时间');
- ylabel('幅值');
Matlab运行的结果如下:
波形前端部分:
波形后端部分:
从上面的对比结果中可以看出,函数arm_cfft_f32计算前后的正弦波基本是一致的。
举报