правильная длина БПФ для функции ARM CMSIS DSP fft

В настоящее время я пытаюсь использовать библиотеку ARM CMSIS DSP на моем чипе cortex m3 PSoC 5lp.
Я столкнулся с некоторыми проблемами при использовании некоторых функций, и у меня есть вопрос об использовании функций arm_cfft_q15 (или любых arm_cfft_*** функций ).

Скажи, что у меня есть

    q15_t ADC_samples[1024];
    q15_t MAG_of_fft[1024];

и я бегу

    arm_cfft_q15(1024pt_fft, ADC_samples, sample_length);

это делает преобразования «на месте». Теперь из-за этого, поскольку БПФ возвращает как действительные, так и мнимые значения, на самом деле он сможет вернуть только fft длиной 512 или это 512 из 1024 отсчетов БПФ? После получения БПФ я делаю

    arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);

где fftlength равно 1024.

Это возвращает MAG_of_fft, и когда я рисую его, действительно кажется, что это форма, которую я ожидал увидеть, но я не знаю точно, как интерпретировать результаты, поскольку я не знаю, какова точная длина моего БПФ. Я говорю, что делаю БПФ 1024pt, но, похоже, возвращает только БПФ 512pt, или только половину БПФ 1024pt, то или другое.

Так я правильно понимаю? Это означает, что массив ADC_samples должен быть в два раза длиннее, чем данные в нем, чтобы я мог получить БПФ 1024 pt? а затем я могу вычислить величину БПФ, используя этот массив 2048, сообщив ему, что длина БПФ равна 1024?

Может ли кто-нибудь объяснить мне, как правильно интерпретировать эти функции и какой длины БПФ мне следует ожидать?


person scarlso9    schedule 25.08.2015    source источник


Ответы (1)


Семейство функций arm_cfft работает с комплексными сигналами. Другими словами, 1024-точечное БПФ, выполняемое с arm_cfft_q15, требует 1024 сложных входных выборок, которые представлены 2048 q15_t значениями (чередующиеся действительные и мнимые части, как описано в документация по программной библиотеке CMSIS DSP). По возвращении буфер содержит 1024 комплексных значения (2048 q15_t значений), соответствующих представлению в частотной области комплексного входного сигнала.

Итак, адаптируя этот пример к вашему случаю, , вы должны вычислить БПФ с помощью:

q15_t ADC_samples[2048];
arm_cfft_q15(1024pt_fft, ADC_samples, 0, 1);

Последующий звонок

q15_t MAG_of_fft[1024];
arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);

с fftlength=1024 затем уменьшает 1024 комплексных значений (2048 q15_t значений) в ADC_samples до 1024 реальных значений величины (1024 q15_t значений) и сохраняет результат в MAG_of_fft.

В качестве дополнительного примечания, если вы действительно имеете дело с сигналами с реальной оценкой, то вы могли бы использовать те же функции и заполнять каждый второй индекс (мнимые части) буфера ADC_samples нулями (таким образом, используя ADC_samples буфер, который вдвое превышает ваше фактическое количество реальных выборок). В качестве альтернативы вы можете использовать более эффективное семейство функций arm_rfft (описано в этот раздел документации).

person SleuthEye    schedule 29.08.2015
comment
Обратите внимание, что я намеренно избегал усложнения ответа, слишком углубляясь в arm_rfft, который, похоже, не является предметом вашего вопроса (при необходимости я мог бы уточнить его в отдельном вопросе). - person SleuthEye; 29.08.2015
comment
Хорошо, я думаю, это проясняет мою путаницу по поводу размера массива, вводимого в функцию. Я также посмотрю на семью arm_rfft, если у меня возникнут какие-либо вопросы, которые я обязательно им задам. Спасибо. - person scarlso9; 31.08.2015