Программирование DSP CMSIS DSP: функции БПФ для обработки действительных чисел Sat, March 28 2020  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

CMSIS DSP: функции БПФ для обработки действительных чисел Печать
Добавил(а) microsin   

В библиотеку CMSIS DSP включены специализированные алгоритмы для обработки FFT последовательности действительных чисел (Real FFT, RFFT). Преобразование FFT определено на комплексных числах, однако многие приложения в качестве входных данных имеют выборки действительных значений. Алгоритмы RFFT получают преимущество свойств симметрии FFT, и имеют преимущество над комплексными алгоритмами той же самой длины.

Быстрые алгоритмы RFFT полагаются на обработку смешанного основания (mixed-radix) CFFT, которая сохраняет процессорное время. На картинке ниже показаны шаги по вычислению прямого RFFT длины N.

[Real Fast Fourier Transform (RFFT)]

Действительная последовательность изначально обрабатывается как если бы она была комплексной, для выполнения CFFT. Далее на этапе обработки данные преобразуются для получения половины частотного спектра в комплексном формате. Кроме первого комплексного числа, которое содержит 2 действительных числа X[0] и X[N/2], все данные комплексные. Другими словами, первая комплексная выборка содержит 2 упакованных действительных значения.

RFFT

Рис. 1. Прямое преобразование БПФ для действительных чисел (Real Fast Fourier Transform, RFFT).

Вход инверсного RFFT должен иметь тот же формат, что и выходные данные прямого RFFT. На первом этапе обработки выполняется предварительная обработка данных для последующего выполнения обратного CFFT.

RIFFT

Рис. 2. Обратное преобразование БПФ для действительных чисел (Real Inverse Fast Fourier Transform, RIFFT).

Плавающая точка (float32). Основные функции arm_rfft_fast_f32() и arm_rfft_fast_init_f32(). Старые функции arm_rfft_f32() и arm_rfft_init_f32() устарели, но все еще документируются.

БПФ действительной N-точечной последовательности имеет четную симметрию в частотной области. Вторая половина данных равна сопряжению первой половины, перевернутой по частоте. При рассмотрении данных мы видим, что можно однозначно представлять FFT, используя только N/2 комплексных чисел. Они упакованы в выходном массиве, где чередуются действительные (real) и мнимые (imaginary) компоненты:

X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }

Бывает, что первое комплексное значение (real[0], imag[0]) в действительности все real. real[0] представляет постоянное смещение, и imag[0] должен быть 0. (real[1], imag[1]) это фундаментальная частота, (real[2], imag[2]) первая гармоника и так далее.

Функции RFFT упаковывают данные домена частоты таким же способом. Прямое преобразование (из домена времени в домен частоты) выводит данные в этой форме, и обратное преобразование ожидает входные данные в этой же форме. Функция всегда выполняет необходимое реверсирование бит, чтобы входные и выходные данные всегда были в нормальном порядке. Функции поддерживают длины массивов [32, 64, 128, ..., 4096] выборок.

Фиксированная точка (Q15 и Q31). Алгоритмы RFFT определены аналогичным способом, и внутри себя они используют комплексное преобразование N/2. Комплексное преобразование внутри себя применяет масштабирование, чтобы избежать переполнений фиксированной точки. Общее масштабирование эквивалентно 1/(fftLen/2).

Для каждого преобразования должна быть определена отдельная структура, однако таблицы коэффициентов вращения и таблицы реверса бит можно использовать повторно.

Существуют также соответствующие функции инициализации для каждого типа данных. Функция инициализации выполняет следующие действия:

• Устанавливает значения внутренних полей структуры.
• Инициализирует указатели на таблицы коэффициентов вращения и реверса бит.
• Инициализирует внутреннюю структуру данных комплексного FFT.

Использование функции инициализации не является обязательным. Однако, если она используется, то экземпляр структуры не может быть размещен в секцию данных const. Чтобы разместить экземпляр структуры в секцию данных const, то он должен быть инициализирован вручную следующим образом:

arm_rfft_instance_q31 S =
{
   fftLenReal,
   fftLenBy2,
   ifftFlagR,
   bitReverseFlagR,
   twidCoefRModifier,
   pTwiddleAReal,
   pTwiddleBReal,
   pCfft
};
 
arm_rfft_instance_q15 S =
{
   fftLenReal,
   fftLenBy2,
   ifftFlagR,
   bitReverseFlagR,
   twidCoefRModifier,
   pTwiddleAReal,
   pTwiddleBReal,
   pCfft
};

Здесь fftLenReal это длина преобразования последовательности действительных чисел, fftLenBy2 это длина внутреннего комплексного преобразования. ifftFlagR выбирает прямое (0) или инверсное (1) преобразование. bitReverseFlagR выбирает выход с реверсом бит (0) или нормальный порядок бит (1). twidCoefRModifier это модификатор шага для таблицы коэффициентов вращения. Значение основано на длине FFT. Указатель pTwiddleARealpoints указывает на массив A коэффициентов вращения; указатель pTwiddleBRealpoints указывает на массив B коэффициентов вращения; pCfft указывает на экземпляр структуры CFFT (Complex FFT). Структура CFFT также должна быть инициализирована. См. документацию arm_cfft_radix4_f32() для получения подробностей по статической инициализации экземпляра структуры Complex FFT.

[Ссылки]

1. Real FFT Functions site:keil.com.
2. CMSIS DSP: комплексные функции БПФ.

 

Добавить комментарий


Защитный код
Обновить

Top of Page