Правильная длина FFT для функции FFT ARM CMSIS DSP
В настоящее время я пытаюсь использовать библиотеку 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);
это делает преобразования "на месте". Теперь, из-за этого, поскольку БПФ возвращает как действительные, так и мнимые значения, фактически он сможет возвращать только БПФ длиной 512 или это 512 из 1024 выборок БПФ? После получения БПФ я делаю
arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);
где fftlength
1024
Это возвращает MAG_of_fft
и когда я рисую его, это действительно кажется той формой, которую я ожидаю увидеть, но я не знаю точно, как интерпретировать результаты, так как я не знаю, как долго мой FFT точно. Я говорю это, я делаю FFT 1024pt, но он, кажется, только возвращает FFT 512pt, или только половину FFT 1024pt, один или другой.
Так я правильно понял? Это означает, что ADC_samples
массив должен быть вдвое длиннее, чем данные в нем, чтобы я мог получить БПФ 1024 pt? и затем я могу вычислить величину БПФ, используя этот массив 2048, сказав, что длина БПФ равна 1024?
Может кто-нибудь объяснить мне, как правильно интерпретировать эти функции и какую длину БПФ мне следует ожидать?
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
семейство функций (описано в этом разделе документации).