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.

[参考译文] 使用 RFFT 库时出现问题

Guru**** 1790570 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/568940/problem-using-rfft-library

器件型号:TMS570LS1224

你(们)好

我尝试在 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 调用了错误的、还是缺少了什么??

谢谢!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    米格尔

    那么、您在数学上到底要做什么、结果与 MATLAB 得到的结果有何不同?

    您的 Matlab 代码也是什么样的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一个问题-您是否尝试过单频正弦波的测试输入?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Anthony

    希望你们做得更好=)

    我解释代码。 因为 FFT 算法接受最大值的缓冲器 2048个数据。 由于我有5120个数据(不确定我是否将其写入正确)、我需要将数组分解为用于 FFT 的较小数组。 首先、我断开数组、运行 FFT 并获取输出数组的幅度。 (所以... 我使用分裂和征服的军国主义战略... 我不知道这是否会导致问题、但是... 我认为它可能更多地是我对某个东西的 FFT 初始化所提供的信息...)  

    然后、我连接我必须获得最大值的4个数组的幅度。  

    以下是 MCU 输出的图像:

    下面是使用相同数据从 Matlab 代码获取的图像:  

    数据位于 MATLAB 代码内。 数据是 MCU 上实现的 FIR 滤波器的输出、与 MATLAB 完全相同。  

    e2e.ti.com/.../5775.prueba_5F00_fourier.m.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Miguel ">数据位于 MATLAB 代码内。 数据是 MCU 上实现的 FIR 滤波器的输出、与 MATLAB 完全相同。  [/报价]

    (请访问站点查看此文件)这有点偏离主题、但我在 Windows 7 PC 上下载了 prueba_fourier.m.zip 文件、以便在 Matlab 中查看。

    下载并解压缩文件后、我收到以下 Windows 7弹出窗口、最初我认为我可能有病毒:

    我认为这是因为 zip 文件包含 Windows 7认为是加密文件的内容(在 Windows 资源管理器中._MACOSX/._prueba_傅 里叶.m 文件显示为绿色)。

    这只是对下载 zip 文件的任何其他人的警告。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是因为我使用的是 Mac。 文件正确。 我已经在这里上传了很多文件、下载了这些文件、或者打开了我的 Windows 版本的.zip 文件、并且始终显示_MACOSX_文件。 但您必须打开普通文件、而不是关心其他文件。 它只是 Mac 的功能(我不知道为什么)我不能在这里添加代码是因为数据(是5120缓冲区...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 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 看起来包含一些有用的信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看到了... 我今天会查找并通知您。 我认为我可以直接连接结果、但看起来不...  

    非常感谢切斯特!! 我希望今天能有一些东西来更新这个帖子

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 我一直在看它、我发现我需要对算法进行一些修改... 我无法完全理解。
    此外... 我不确定是否必须使用 split_rfft、但我认为需要使用。 只是不确定如何... 我从 DSP 库中获取了 FFT_BIN 示例、但... 这种情况似乎是因为,除了连系部分以外,还缺少了一种运动的东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,在看了整个周末之后,我不知道我应该做什么修改... 我的意思是... 我查看了代码、但我不清楚应该在哪里进行修改... 我看到 N 必须被修改、但是... 我得到了以下解释:
    www.dsprelated.com/.../97880-1.php
    www.astro.gla.ac.uk/.../
    但仍然不确定我应该在哪里进行修改... 如果有任何帮助、我将不胜感激...

    谢谢!!