This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你(们)好
我尝试在 MCU 上实施 RFFT、但在处理数据以及使用我从 Matlab 获得的结果检查结果时、有很大差异... FFT 的代码如下所示:
bool FFT (uint32_t FFT_size、float32_t * input_data、float32_t * output_data) { FFT_don=0; arm_status; arm_rfft_instance_f32 S; arm_CFFT_radx4_instance_f32 S_CFFT; status = arm_math 成功; /*初始化 RFFT/RIFFT 模块 ARM_STATUS ARM_rfft_init_F32 ( ARM_rfft_instance_F32 * S、 ARM_CFFT_radx4_instance_F32 * S_CFFT、 UINT32_t fftLeniffal、 U&32_t RevertFlagR、 UINT32_t FSIT_S 、UINT32_t FSIZE = TRFSIFSIZE *、UINT32_TRIFT_TRIFT_TRIFT/ TRIFT_TRIFT/ TRFSIZE = RIT_TRIFT/ TRIFT/ TRIFT/ TRIFT* TRIFT_ /*通过 CFFT/CIFFT 模块处理数据*/ arm_rfft_F32 (&S、input_data、output_data); /*通过复数幅度模块处理数据,以 计算每个 bin 的幅度*/* void arm_cmplx_mag_F32 ( pSrat32_t *、 atat_t_float_t_t* 、mag_out_t_outputs *、num_t_t_t_t_num_translift_t_translation_t_int_outputs);* if (status!= ARM_MATH_SUCCESS) { while (1); } if (FFT_input==3) FFT_DONE = 1; return FFT_DONE; }
我上传用于调用函数的代码
if (FFT_INPUT=0) { DATA_COUNT=0; m_COUNT=0;//;order_filter; DO{ mulcate_data1[data_count]=mulc_dfiltered [m_count]; data_count++; m_count++; } while (data_countnthnel注意 事项<fft_Size_1_2);//sizeof(muscle_data1)); fft(fft_Size_1_2, muscle_data1, fft_output1); fft_input++; } if (FFT_input=1) { data_count=0; do{ must_data2[data_count]=mcus_filtered [m_count]; m_count++; data_count++; }while (<fft_Size_1_2);//sizeof(muscle_data2)); ) FFT (FFT_SIZE_1_2、Muscum_data2、FFT_output2); FFT_INPUT++; } if (FFT_INPUT=2) { DATA_COUNT=0; do{ must_data3[data_count]=mcus_filter[m_count]; m_count++; data_count+ ;while (countines+<fft_Size_3_4);//sizeof(muscle_data2)); ) FFT (FFT_SIZE_3_4、Muscum_data3、FFT_output3); FFT_INPUT++; } if (FFT_INPUT=3) { DATA_COUNT=0; DO{ Muscum_data4[DATA_COUNT]=Muscum_filtered [m_count]; m_count++; data_count+;while (count+)
以及包含以下变量的代码:
/*---------------------------------- * FFT 的全局变量 *------------------------------------------------------- /static uint32_t FFT_size_1_2 = 2048; static uint32_t FFT_size_3_4 = 512; static uint32_t FFT_size_total = 5120; char FFT_input; bool FFT_done; static uint32_t floutflagR = 0; static uint32_t traduint32_t statust = 2048;static uint32_t_t statuint32_t /t statuint32_t statut /t statuint32_t /t statut /t statuint32_t /t /t statuintut /t /t statuint32_t /t statuintut /t /t statuint32_t statut /t float32_t Muscle data3[512]; float32_t Muscle data4[512]; float32_t FFT_output1[4096]; float32_t FFT_output2[4096]; float32_t FFT_output3[1024]; float32_t FFT_output4[1024]; float32_t Musce_FFT_out[5120];
我不n´t 发生了什么... 我是不是给 rfft init 调用了错误的、还是缺少了什么??
谢谢!!
你好、Anthony
希望你们做得更好=)
我解释代码。 因为 FFT 算法接受最大值的缓冲器 2048个数据。 由于我有5120个数据(不确定我是否将其写入正确)、我需要将数组分解为用于 FFT 的较小数组。 首先、我断开数组、运行 FFT 并获取输出数组的幅度。 (所以... 我使用分裂和征服的军国主义战略... 我不知道这是否会导致问题、但是... 我认为它可能更多地是我对某个东西的 FFT 初始化所提供的信息...)
然后、我连接我必须获得最大值的4个数组的幅度。
以下是 MCU 输出的图像:
下面是使用相同数据从 Matlab 代码获取的图像:
数据位于 MATLAB 代码内。 数据是 MCU 上实现的 FIR 滤波器的输出、与 MATLAB 完全相同。
[引用 user="Miguel ">数据位于 MATLAB 代码内。 数据是 MCU 上实现的 FIR 滤波器的输出、与 MATLAB 完全相同。 [/报价]
(请访问站点查看此文件)这有点偏离主题、但我在 Windows 7 PC 上下载了 prueba_fourier.m.zip 文件、以便在 Matlab 中查看。
下载并解压缩文件后、我收到以下 Windows 7弹出窗口、最初我认为我可能有病毒:
我认为这是因为 zip 文件包含 Windows 7认为是加密文件的内容(在 Windows 资源管理器中._MACOSX/._prueba_傅 里叶.m 文件显示为绿色)。
这只是对下载 zip 文件的任何其他人的警告。
[引用 user="Miguel 的说法]我尝试在 MCU 上实施 RFFT、但在处理数据以及使用 Matlab 提供的结果进行检查时、有很大差异... FFT 的代码如下所示: 代码显示正在运行大小为2048、2048、512和512的 FFT、其中生成的输出连接到长度为5120的数组中。 代码计算的结果与5120点 FFT 不同。
我获取了您的 Matlab 代码并进行了修改以根据代码执行 FFT、然后生成了以下结果(看起来与代码中的图具有相同的峰值、但幅度是其两倍):
Matlab 文件随附 在 e2e.ti.com/.../6786.prueba_5F00_fourier_5F00_multiple_5F00_ffts.zip 上
如果您希望从多个较小的 FFT 中计算较大的 FFT、则需要执行一些计算来合并较小 FFT 的结果。
如何使用更小的 FFT 计算大尺寸 FFT? 非常大的 FFT 看起来包含一些有用的信息。
好的,在看了整个周末之后,我不知道我应该做什么修改... 我的意思是... 我查看了代码、但我不清楚应该在哪里进行修改... 我看到 N 必须被修改、但是... 我得到了以下解释:
www.dsprelated.com/.../97880-1.php
www.astro.gla.ac.uk/.../
但仍然不确定我应该在哪里进行修改... 如果有任何帮助、我将不胜感激...
谢谢!!