8-битное БПФ для архитектур ЦП?

Я ищу FFT-движок, который может обрабатывать 8-битные преобразования реальных в сложные (размером 65K). Это необходимо для ускорения механизма обработки сигналов в реальном времени. В настоящее время он ограничен 8-разрядными -> FP32 и FP32 -> 8-разрядными преобразованиями, а также фактическим FFT, ограниченным пропускной способностью памяти (в настоящее время мы используем FFTW).

Я думал, что проект Спираль мог бы сделать это http://spiral.net, но единственный код, который, кажется, доступен на их веб-странице, предназначен для одиночного или двойного преобразования.

Кто-нибудь знает какие-либо библиотеки C или C ++, которые могут это сделать?

2

Решение

Иногда назад я сталкивался с той же проблемой. FFTW для моего информационного кадра был выполнен за 14 мс (вперед, некоторые вычисления и назад), в то время как прямое преобразование байта (или короткого) в массив с плавающей запятой заняло 12-19 мс. Поэтому я сделал функцию SSE для преобразования байтов в числа с плавающей запятой (4 элемента в цикле) и получил значительное увеличение скорости — теперь преобразование выполняется за 2,2-5 мс.

Если ваш компилятор может использовать автовекторизацию, попробуйте сначала.

Если нет, напишите простую функцию преобразования с внутренними.

Я использовал встроенный ассемблер (последовательность команд MOVD, PUNPCKLBW, PUNPCKLWD, CVTDQ2PS, MOVAPS).

procedure BytesToSingles(Src, Dst: Pointer; Count: Integer);
asm
//EAX = Src pointer to byte array
//EDX = Dst pointer to float array !!! 16 byte-aligned !!!
//ECX = Count (multiple of four)
SHR ECX, 2           // 4 elements per cycle
JZ @@Exit
PXOR XMM7, XMM7      // zeros
@@Cycle:
MOVD XMM1, [EAX]     // load 4 bytes
PUNPCKLBW XMM1, XMM7 // unpack to words
PUNPCKLWD XMM1, XMM7 // words to int32
CVTDQ2PS XMM0, XMM1  // convert integers to 4 floats
MOVAPS [EDX], XMM0   // store 4 floats to destination array
ADD EAX, 4           // move array pointers
ADD EDX, 16
LOOP @@Cycle
@@Exit:
end;

Обратите внимание, что реализация FFT на 8-битных данных будет страдать от проблем с числовыми ошибками, как писал Пол Р. в комментарии.

2

Другие решения

Ты сделаешь не хочу сделать всю обработку в фиксированной точке. Ваши данные превратятся в кашицу в БПФ такого размера. Технически, вы можете использовать 32-битную фиксированную точку и сохранить всю динамику, но вам все равно придется конвертировать данные а также это будет медленнее, чем использование float (вы пометили SSE, поэтому я предполагаю, что вы работаете на машине с Intel, имеющей FPU). Я основываю свое мнение на моей работе по созданию kissfft

Вместо этого сосредоточьтесь на ускорении преобразования типов.
Я не запускал код сборки MBo, но это выглядит как правильный подход. Я думаю, что раскрутка может сделать это быстрее.

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

2

По вопросам рекламы [email protected]