1024 Size Complex Int16 FFT за 2 мс на STM32F103C

Берит
Пт, 03 июня 2016 г., 11:31
Спасибо всем, и особенно Rogerclark!

После тестирования различных процедур C FFT, включая FHT, Real-FFT, библиотеки CMSIS и поиск их всех, чтобы они были слишком медленными, чтобы запускать аудио 38 кГц, размеры 1024 на STM32F103C, я наконец выяснил, как сделать Среда Arduino принимает функции сборки.

Все подпрограммы необходимы не менее 28 мс для выполнения 1024 FFT, причем FHT является самым быстрым. Это было недостаточно для анализа спектра в реальном времени.

Реализация Ассамблеи (код от команды приложений MCD, STM) занимает 2 мс за 1024 окна, но не на месте, поэтому вам понадобится не менее 8 КБ ОЗУ для него (2x1024 UINT32_T Buffers).

С превосходными возможностями DMA, замена буферов и выполнения БПФ без отсутствия удара возможны, все при выводе спектрограммы на дисплей SPI ILI9341.

Все, что нужно, это сделать папку в библиотеках Arduino с следующими двумя файлами:
CR4_FFT_1024_STM32.с /** @brief Deprecated; use attachInterrupt(TIMER_CH1, handler) instead. */ void attachCompare1Interrupt(voidFuncPtr handler) { attachInterrupt(TIMER_CH1, handler); }

Mrburnette
Пт. 03 июня 2016 12:07
@Beherith: добро пожаловать

Спасибо за ваш пост... Я надеюсь, что у меня будет возможность попробовать это на выходных... После завершения списка Todo жены, конечно.

Луча

Mrburnette
Пт, 03 июня 2016 г., 15:13
Вместо использования .час & .S файлы как библиотека; Я бы предложил только включить их в проект как вкладки:
Скриншот.jpg
Скриншот.JPG (114.47 киб) просмотрено 4754 раза

Mrburnette
Пт, 03 июня 2016 г., 15:22
Вложение удаляется по мере развития кода.

Луча

Берит
Пт, 03 июня 2016 г., 16:20
Спасибо, Mrburnette, рад видеть, что миссис не перегрузила ваш список Todo : D

Just4fun
Пт, 03 июня 2016 г., 16:40
Mrburnette написал:Предоставлено пост
Я собираюсь опубликовать молнию вышеуказанного проекта в течение следующих нескольких дней ... тогда этот пост будет удален.

Mrburnette
Пт, 03 июня 2016 г., 17:01
Берит написал:Спасибо, Mrburnette, рад видеть, что миссис не перегрузила ваш список Todo : D

Martinayotte
Пт, 03 июня 2016 г., 17:35
Итак, вы ваш собственный босс на пару часов ... :ржу не могу:

Rogerclark
Пт, 03 июня 2016 г., 8:57 вечера
Это очень круто!

Могу ли я добавить этот код в примеры в репо ?

Теперь у нас есть искусственная библиотека, полная примеров, и это станет отличным дополнением к примерам

Берит
Пт, 03 июня 2016 г. 22:39
Я нашел несколько очень неприятных ошибок в моем коде, поэтому, пожалуйста, дайте мне до завтра, чтобы опубликовать исправления.

Mrburnette
Пт, 03 июня 2016 г., 11:17
Берит написал:Я нашел несколько очень неприятных ошибок в моем коде, поэтому, пожалуйста, дайте мне до завтра, чтобы опубликовать исправления.

Rogerclark
SAT 04 июня 2016 г. 3:23 утра
Не беспокойся

Берит
Ср. 08 июня 2016 г. 8:18 утра
Сделал для этого репо Github:

https: // github.com/beherith/stm32_spectromet

Он поддерживает пару режимов отображения, вы можете спустить PB12, чтобы процитироваться через них.
линейный - работает в реальном времени
Logarithmic - мой код для биннинга журнала слишком медленно в режиме реального времени
Squised -Linear - более низкие частоты отображаются в полном объеме, более высокие суммируются

Уровень сигнала - отображает входную форму волны, а также FFT. Снимите PB13, чтобы переключиться на этот режим.

Есть некоторые выдающиеся проблемы, основные из которых заключаются в том, что в режиме в реальном времени некоторые части кодов фактически записываются в буфере образца. Это видно с параллелью = 1 и снимая PB13 :(



stm32_fft_spectrum_analyzer.jpg
stm32_fft_spectrum_analyzer.JPG (79.06 киб) просмотрено 1084 раз

Пито
Ср. 08 июня 2016 г. 10:53
Отличная работа! Библиотека может выполнить FFT размером 1024 int16 примерно за 3 мс. К вашему сведению (я перепутал с FFT во время моего R&D в Uni довольно много):
1. В 1985 году я сделал FFT на Sinclair Spectrum (Basic) - потребовалось ~ 30 минут
2. В 1987 году я сделал FFT на Sinclair Spectrum (ASM) - потребовалось ~ 30 секунд
3. В 1988 году я сделал FFT на Atari STM (Basic Compuled) - потребовалось ~ секунды
Я сделал с измерениями шума 1/f, поэтому я не спешил : D
4. В 2010 году я сделал FFT на DSPIC33 - это заняло ~ 1 мс (512xint16)
Это может работать даже быстрее на STM32F4XX, поскольку включает в себя DSP Math (и FPU) (я думаю, 150US может быть выполнен)..

Mrburnette
Ср. 08 июня 2016 г. 14:27
Берит написал:Сделал для этого репо Github:

https: // github.com/beherith/stm32_spectromet
<...>

Mrburnette
Ср. 08 июня 2016 г. 14:42
Пито написал:<...>
К вашему сведению (я перепутал с FFT во время моего R&D в Uni довольно много):
<...>

Берит
Ср. 08 июня 2016 г., 16:45
Pito, библиотека FFT, используемая в этом проекте, находится вручную в сборке, написанная самими людьми STM. Я сомневаюсь, что можно сбрить на порядок от него.

Я лицензировал свой код в качестве общественного достояния, поэтому не стесняйтесь включать/связывать его в примеры STM32Duino.

Пито
Чт, 09 июня 2016 г., 6:16
Но F103 отличается от F407, особенно в сборке. F407 включает в себя инструкции DSP, чтобы вы могли получить намного лучшую скорость FFT.
К вашему сведению - 40 МГц такта DSPIC33 (включает в себя также инструкции DSP) Afaik быстрее в FFT (написано в C), чем F103 @72 МГц в сборке.

Берит
Чт, 09 июня 2016 г., 8:22 утра
Ах, я пропустил квалификатор F4XX : D
Я только что -то хорошо в сборке AVR, сборка ARM не имеет возможности для меня. Но этот спектрометр до сих пор был чрезвычайно веселым и невозможным, не стоя на плечах всех присутствующих здесь гигантов и перед ними.

Целью проекта является использование этого БПФ для определения очень специфического лая собаки : D

Ахулл
Чт, 09 июня 2016 г., 10:44
Берит написал:Ах, я пропустил квалификатор F4XX : D
Я только что -то хорошо в сборке AVR, сборка ARM не имеет возможности для меня. Но этот спектрометр до сих пор был чрезвычайно веселым и невозможным, не стоя на плечах всех присутствующих здесь гигантов и перед ними.

Целью проекта является использование этого БПФ для определения очень специфического лая собаки : D

Пито
Чт, 09 июня 2016 г., 11:31
Да. Если вы делаете достаточно FFT в секунду, вы увидите «автомобильный шум» (куча спектральных линий), движущихся слева направо, когда автомобиль проходит мимо.
Остальное - математика.

Mrburnette
Чт, 09 июня 2016 г., 11:39
Пито написал:Да. Если вы делаете достаточно FFT в секунду, вы увидите «автомобильный шум» (куча спектральных линий), движущихся слева направо, когда автомобиль проходит мимо.
Остальное - математика.

Пито
Пт 10 июня 2016 г., 7:13 утра
:)
Вы также должны рассмотреть вариант использования..
Когда автомобиль проходит со скоростью OD 20 м/с, при 20DEGC, а «автомобильный шум» будет формироваться вокруг, скажем, 400 Гц,
Затем, когда автомобиль приближается к вашему микрофону, частота будет 425 Гц, и, отключая микрофон, частота будет 378 Гц.
Таким образом, вы должны быть в состоянии «масштабировать» в диапазоне 370-430 Гц, чтобы увидеть «сдвиг допплера»..

Ахулл
Пт 10 июня 2016 г. 8:57 утра
Пито написал::)
Вы также должны рассмотреть вариант использования..
Когда автомобиль проходит со скоростью OD 20 м/с, при 20DEGC, а «автомобильный шум» будет формироваться вокруг, скажем, 400 Гц,
Затем, когда автомобиль приближается к вашему микрофону, частота будет 425 Гц, и, отключая микрофон, частота будет 378 Гц.
Таким образом, вы должны быть в состоянии «масштабировать» в диапазоне 370-430 Гц, чтобы увидеть «сдвиг допплера»..

Rogerclark
Пт 10 июня 2016 г. 10:04
Итак, мы с Роджером ... Угадай, что следует захватить этот длинное удлинительное шнур (используется для электрического триммера) и переместить мою область на дорогу для эксперимента! (нет... Атланта не самое дружелюбное место для такой глупости... Кто -то подумал бы, что это было ценным и стреляет в меня за прицел.) Я не думаю, что у меня возникнут какие -либо проблемы с установкой на переднем дворе или даже на нашей дороге, чтобы измерить шум автомобиля.

Основная проблема - отсутствие движения на улице. Из -за нашей уличной планировки единственные машины, едущие по улице, - это либо местные жители, либо люди, которые потеряны ;-)

Как насчет записи шума автомобиля на вашем телефоне, и они воспроизводят запись обратно на вход ADC (через подходящую кондиционирование ввода, я.E конденсатор, и, возможно, сеть разделителей резисторов)

Пито
Пт 10 июня 2016 г., 10:30 утра
Вы можете записать тон в свой телефон, т.е. Шаг 1000 Гц, а затем быстро бегите по телефону с телефоном в руке : D : D

Ахулл
Пт 10 июня 2016 г. 10:38 утра
Пито написал:Вы можете записать тон в свой телефон, т.е. Шаг 1000 Гц, а затем быстро бегите по телефону с телефоном в руке : D : D

Пито
Пт 10 июня 2016 г., 11:38
Не рискуйте сердечным приступом во время бега, вы можете поместить свой телефон в вакуумную пушку и стрелять поблизости с микрофоном.
https: // www.YouTube.com/watch?V = CVL99YIB3NQ

С скоростью 100 м/с и высотой 1000 Гц Спектральная линия будет перемещаться с 1410 Гц до 774 Гц во время пролета : P

Стивестронг
Пт 10 июня 2016 г. 14:49
@Beherith
Не было бы более продуктивным для использования кода C БПФ, а затем попытаться проанализировать (оптимизировать) полученный код ASM? Я имею в виду, по крайней мере, для отладки.
Таким образом, можно дифференцировать код ASM между F1XX, F3ZZ и F4YY.
Или, может быть, можно найти несколько директив компилятора и использовать их, чтобы получить оптимизированный код без использования ASM, просто чистого c.
У вас есть рутина FFT в C? Было бы полезно включить его в ваш репо, я думаю.

Rogerclark
Солнце 12 июня 2016 г. 1:47
Не быть экспертом по БПФ...

Кто -нибудь может сказать мне, какой диапазон представляет выходной выход ?

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

Я предполагаю, что окно Params (массив) регулируют диапазон частот общего БПФ ?

Еще одна вещь, которую я не понимаю.. Почему вы не уменьшили количество баллов, сгенерированных кодом ассемблера FFT ?
Похоже, что это число, 1024, определено в верхней части ассемблера и может быть изменено для другого значения.

Таким образом, поскольку дисплей имеет только горизонтальное разрешение 320, вы можете уменьшить размер БПК до 512 и удвоить скорость.

Я не уверен, что код ассемблера STM поддерживает размер арбитатного БПК, но если это так, не могли бы вы уменьшить размер до 320???

Mrburnette
Солнце 12 июня 2016 г. 2:26 утра
Роджер,

Только половина выходных бункеров представляет полезные данные, поэтому сокращение размера до 512 эффективно означает разрешение 256 байнов.

Обзор: http: // учиться.Адафрут.com/fft-fun с- ... трансформации
другой
http: // wiki.OpenMusicLabs.com/wiki/arduinofft

Луча

Rogerclark
Солнце 12 июня 2016 г., 4:48
Привет, Рэй

ХОРОШО. Мне нужно будет еще немного прочитать фона

Из того, что я прочитал, количество бункеров FFT - это размер FFT /2 ( http: // Поддержка.Ircam.FR/DOCS/AudioSculp ... 0size.HTML )

Я вижу его FFT S 1024 Point, поэтому для получения количества произведенных бункеров составляет 512, но буферы длины 1024 - поэтому я предполагаю, что вторая половина буфера используется в генерации первой половины, но не используется данные.



На не связанной ноте...

Я искал другие программы, используя этот код FFT, и я обнаружил, что ST также написал различные другие функции DSP в ассемблере, включая

Iir Arma Filter
FIR Filter
PID -контроллер

и разные размеры FFT

(Код для этого, кажется, здесь, и в других местах, https: // github.com/tuanpmt/stm32f10x_ds ... RC/ASM/GCC)

Пито
Солнце 12 июня 2016 г. 8:24 утра
FFT 1024point (БПФ всегда сложная математика)
где «точка» означает сложное число, где
а) Реальная часть - это реальный сигнал, то есть чтение напряжения от АЦП, отображаемое по скорости дискретизации, т.е. 1000 Гц
б) Часть обрабатывающего воображения установлена ​​на нулевые значения

производит
а) 512 Реальные результаты
б) 512 Результаты изображения

И вы должны объединить оба, чтобы получить «реальную амплитуду спектральных компонентов - Ampl»

ampl [k] = sqrt (re [k]^2 + im [k]^2), k = 0..511

Таким образом, результатом являются спектры с 512 частотами, каждая частота с амплитудным Ampl [0..511].
Частота ноль является частью входного сигнала постоянного тока, поэтому реальные частоты находятся в бункерах от 1-511.
511 -я частота составляет 1000/2 (скорость диск 2), с линейным делением.

Также не возражайте, что вам нужен «антиалиас фильтр» [HW One] перед АЦП, чтобы получить результат.
Любое частотное содержание в входном сигнале с частотой выше «Скорость дискретизации/2» будет «отражать» непосредственно в результаты FFT, которые вы видите.
Например, частота 520 Гц с амплитудой 1000 будет видна после FFT в качестве частоты 480 Гц с полной амплитудой 1000 (при условии, что скорость отбора проб составляет 1000 Гц). Входная частота 990 Гц будет отражать как 10 Гц полной амплитуды (при условии, что у вас нет никакого фильтра, а реакция АЦП является плоской до частоты дискретизации).
Таким образом, вы должны снять все выше «частоты»/2 «частота» до того, как вы делаете ADC »как можно лучше (самой сложной и сложной частью моих исследований в восьмидесятых годах была дизайн антиалиазионных фильтров с низкими частотами - обычно Высшие возможные заказы).

Также не обращайте внимания на «окно», используемые (хэмминг, Ханнинг, Блэкман и около 20 других) оказывают большое влияние на форму и амплитуду спектра, которые вы увидите на дисплее. Выбор функции окна зависит от того, чего вы на самом деле хотите достичь при измерениях БПК..

Точность спектральных амплитуд зависит от количества усредненных спектров БПФ.
При одном измерении ошибка может быть на 100%, чем больше усреднение вы делаете, тем лучше вы получите спектры.
Afaik точность зависит от 1/sqrt (n), где n - количество усредненных спектров. Таким образом, со усреднением 100 Spectra FFT вы получаете точность 10%.
Результаты FFT обычно представлены как «частота спектральной плотности» против «частоты» в масштабах логики, поэтому усреднение не так критично..

БПФ - это ракетостроение, действительно :) :) :)

Racemaniac
Солнце 12 июня 2016 г., 10:08
Человек, я люблю подобные дискуссии здесь xD

Rogerclark
Солнце 12 июня 2016 г., 11:44
Спасибо @pito

Это разъясняет, почему вам нужен буфер с бин 1024 для выхода 512 частоты среза.
Страница Adafruit вводит в заблуждение, так как говорит, что Bin [0] - это общая величина сигнала (что делает его звучащим в среднем), также, похоже, подразумевает, что вам нужна только первая половина выходных корзин Это потеряло бы все воображаемые части, которые могут содержать значительную часть амплитуды.

Создание фильтра для полного отключения входных частот выше Sample_rate/2 звучит очень сложно.
Я предполагаю, что в настоящее время это сделано в цифровом виде.

Ахулл
Солнце 12 июня 2016 г., 13:36
Welllll.. Вы можете сделать это механически.. Некоторые из вас, возможно, видели это раньше, но я подумал, что стоит поделиться любым образом.
Анализ Фурье ... полностью механически.



На самом деле это очень хороший способ понимания, что происходит. Посмотрите полный набор видео.

Что касается вопроса о разработке хорошего фильтра прохода полосы.. это искусство само по себе. https: // en.Википедия.org/wiki/band-pass_filter : D .. Но для целей этого упражнения вы сможете получить некоторые результаты с несколькими пассивными.

Ddrown
Солнце 12 июня 2016 г. 18:04
Rogerclark написал:Спасибо @pito

Это разъясняет, почему вам нужен буфер с бин 1024 для выхода 512 частоты среза.
Страница Adafruit вводит в заблуждение, так как говорит, что Bin [0] - это общая величина сигнала (что делает его звучащим в среднем), также, похоже, подразумевает, что вам нужна только первая половина выходных корзин Это потеряло бы все воображаемые части, которые могут содержать значительную часть амплитуды.

Rogerclark
Солнце 12 июня 2016 г. 22:34
@ddrown

Я знаю, что ты имеешь в виду в Найквисте. 2 x oversamplimg - теоретический минимум, требуемый.
На практике я понимаю, что скорость дискретизации обычно намного выше. эн.G 44 кГц для аудио.

Я не уверен в взаимодействии между Найквистом и БПФ, но, похоже, имеет смысл, что именно поэтому вам нужно попробовать как минимум в 2 раза входной сигнал.

Rogerclark
Пн 13 июня 2016 г., 5:01
Я наконец -то приступил к запуску эскиза, но мои времена FFT чуть более 5 мс, а не 2 мс, на моем F103V

Поэтому я посмотрел на код и понял, что БПФ занимает чуть более 2 мс, но расчет величины занимает около 3 мс, поэтому комбинированное время превышает 5 мс

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

В любом случае, теперь мне нужно выяснить, как сделать обратный БПК и вывести образцы в ЦАП через DMA и посмотреть, как это звучит.

Пито
Пн 13 июня 2016 г., 6:21
Ребята из STM сделали FFT ASM - так что должен быть код ASM для IFFT..

Пито
Пн 13 июня 2016 г., 6:31
Или вот ручная оптимизированная FFT IFFT в ASM для STM Cortex M3

https: // e2e.тип.com/поддержка/микроконтроль ... 71/T/44034

Rogerclark
Пн 13 июня 2016 г., 7:29 утра
@pito

К сожалению, код, с которым вы связаны, не хочет собирать под GCC, есть множество вещей GCC не нравится :-(



Я также видел эту статью, которая, по -видимому, предполагает, что при обработке Pre и после того, как функция FFT может использоваться как IFFT

https: // www.DSPLELATED.com/showarticle/800.PHP

Хотя меня озадачивает то, что результат любого из них содержит как реальные, так и воображаемые части

Пито
Пн 13 июня 2016 г. 8:29 утра
Вот где начинается ракетостроение :)
1. «Переход FFT» - это то же самое, что и «БПК»? ДА
2. Если вы связываетесь с экспериментами по FFT/IFFT, используйте входной сигнал (сгенерированный SW) с известными спектрами - т.е. SIN/COS или суммой из нескольких грехов или пульса
3. Не используйте окно
4. При выполнении IFFT вы должны получить точно такой же сигнал, плюс минус цифровой шум (+/- несколько бит) - так как есть потери из -за 16 -битных целых чисел.
5. FFT и IFFT всегда работают с реальным и воображаемым, результатом IFFT должна быть реальная часть с исходным сигналом, воображаемая часть будет полна нулей (не будет из -за цифрового шума, там может быть что -то вроде нескольких битов и там ).

Важное примечание:
1. При выполнении 1024 FFT вы получаете результат как re [0..1023] и я [0..1023], но вы рассматриваете только первую половину массивов RE и IM = [0..511] (Вторая половина массивов RE и IM - это одинаковые значения = симметричное зеркало около 512, так что вы его выбрасываете = это зеркало не используется при отображении спектра на дисплее) - только первая половина - это и re и Im spectra [0..511] Вы показываете на дисплее

Но при выполнении БПФ -> Если вы должны взять целое [0..1023] re и im массивы в качестве ввода в IFFT !!!!
Вы не можете ввести только первые 512 RE и IM (отображаемые спектральные линии), но также «зеркало не используется» RE и IM Spectral Lines !!!


Это означает, что при выполнении сигнала -> ФФТ -> Взимание -> Сигнал, вы не предоставляете расчет спектральных линий
амплитуда = sqrt (re^2 + im^2),
Но вы используете целые 1024 Long Re и Im массивы As-The-Are.

2. При выполнении 1024 IFFT вы получите снова, как RE [0..1023] и я [0..1023], но теперь вы рассматриваете все 1024 re и im points = [0..1023] В результате, где RE содержит исходный сигнал, а IM - нулевой (плюс минус цифровой шум).


[Приложение = 0] FFT IFFT.Jpg [/вложение]

Rogerclark
Пн 13 июня 2016 г., 10:24 утра
@pito

Я предположил, что вам нужно использовать все выходные значения из БПФ для использования с IFFT.

Чего я не заметил, так это то, что код упаковывает реальные и воображаемые (16 -битные) значения на 32 бит

В примере кода реальные и воображаемые значения упакованы в один 32 -битный незначенный целочисленный массив.

Следовательно, я не понял, что индексы 0 - 511 из 1024 баллов БПФ, содержат как реальные, так и воображаемые значения, а не только реальные значения.
Я думал, что 512-1023 содержал воображаемые значения

В любом случае.

Не должно быть слишком сложно проверить методы, которые я нашел для использования FFT как IFFT.

эн.фон.

Генерировать синусоидальную волну E.глин. 1 кГц в памяти.
Запустить FFT

Использовать
Изображение

Обмениваться реальными и воображаемыми ценностями

(что -то вроде)

uint16_t tmp = *bufptr>>16;
*bufptr = (*bufptr << 16) | TMP;

(не должно занимать слишком много времени)

Запустить FFT

Нет необходимости обменять значения.

Просто используйте реальную часть, которая кажется более низким 16 битами.


Снова запустить БПК

Rogerclark
Пн 13 июня 2016 г., 11:24
Ммм

Я сделал несколько тестов, используя теорию в своем предыдущем посте, но я получаю несколько странных результатов.

Я использовал волну пилотушки, так как уже был код для создания этого тестового шаблона.

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

Интересно, вызвано ли это потому, что мы используем 16 -битную математику и, возможно, переполнены.

В любом случае; На данный момент не очень практично использовать FFT, как IFFT

Пито
Пн 13 июня 2016 г., 11:32 утра
Ifft re должна быть той же амплитудой, что и ввод RE в FFT.
Старайтесь не разделять выводы IFFT на n на n.
Также дважды проверьте, подходит ли выходной сигнал FFT (RE и IM -спектральные амплитуды) в 12 -битный «диапазон».
Не ожидайте, что вы получите идеальные результаты сегодня :)

Начните с одной синусоидальной волны. Амплитуда от -2047 до +2047, частота скажем 32. uint16_t act = TIMER2->regs.gen->CCR1;

Mrburnette
Пн 13 июня 2016 г., 11:50 утра
Пито написал: <...>
Не ожидайте, что вы получите идеальные результаты сегодня :)
<...>

Пито
Пн 13 июня 2016 г. 12:02
Я сделал FFT/IFFT в Z80 ASM, потратил 2 месяца, испортив.. В то время нет интернета : D

Mrburnette
Пн 13 июня 2016 г. 12:09
Пито написал:Я сделал FFT/IFFT в Z80 ASM, потратил 2 месяца, испортив.. В то время нет интернета : D

Rogerclark
Пн 13 июня 2016 г., 22:07
@pito

Спасибо

Результаты, которые я получил, используя данные тестирования пилотушки, были очень похожи на пилотую, но величина была неверной, даже до того, как делить на 1024.

Я сделаю еще несколько тестирования, но вчера у меня не хватило времени.

Rogerclark
Вт 14 июня 2016 г., 7:44
@pito

Я провел некоторое тестирование с генератором синусоидальных волн, который вы разместили, и как только я разработал формат входных данных для функции ASM, я вижу, что он генерирует БПФ, как и ожидалось.

С периодом генератора грехов 32, я получаю всплеск в бин 32
С периодом генератора грехов 20 я получаю всплеск в корзине 20

Если я генерирую форму волны, которая представляет собой сумму 2 грешных волн, я вижу 2 шипа в выходных данных FFT

Так что БПФ выглядит так, будто работает отлично

Что вообще не работает, так это обратный FFT, так как это выглядит как конденсатор, заряженный очень шумным запасом.


Однако я подозреваю, что знаю, что IFFT не будет работать, просто используя форвардную БПФ с предварительной и пост -обработкой.

Все методы для IFFT с использованием FFT потребовали бы, чтобы вывод БПФ был в 1024 раза больше, чем фактическое значение формы сигнала.

Таким образом, поскольку FFT подписан только 16 бит, а 1024 - 10 бит, я думаю, что это означает, что он будет только способен обрабатывать входные FFT; S, которые имеют значения плюс или минус 31 (в самом большинстве), как вывод Затем будет 31x1024 до -31 x 1024, которые находятся в диапазоне подписанного 16 -битного.

Я проверю эту гипотезу и опубликую результаты, но в любом случае, похоже, что подпрограмма FFT не используется в качестве обратного FFT, поэтому, кажется, единственные варианты, чтобы либо изменить ассемблер FFT, копируя всю функцию и создавая Обратный FFT, который делает что -то вроде деления 1024, прежде чем пытаться упаковать результат обратно в int16_t (но, поскольку ассемблер не комментируется, и я понятия не имею, что означают коды OP), я подозреваю, что это не будет жизнеспособным вариантом

Или ...

Попробуйте понять, почему другая рука не будет компилироваться

Я думаю, что этот второй вариант с наибольшей вероятностью достигнет успеха ;-)

Пито
Вт 14 июня 2016 г. 8:48 утра
Да, это шаг за шагом усилие. Вы, наконец, найдете проблему, конечно :)
С периодом генератора грехов 32, я получаю всплеск в бин 32
С периодом генератора грехов 20 я получаю всплеск в корзине 20
Насколько велики спектральные линии (фактическое значение FFT против сгенерированной амплитуды)?
Таким образом, поскольку FFT подписан только 16 бит, а 1024 - 10 бит, я думаю, что это означает, что он будет только способен обрабатывать входные FFT; S, которые имеют значения плюс или минус 31 (в самом большинстве), как вывод Затем будет 31x1024 до -31 x 1024, которые находятся в диапазоне подписанного 16 -битного. Обычно конкретные алгоритмы IFFT IFFT ASM предназначены для максимального диапазона входных значений, который меньше, чем тот тип, который они используют.
Например, "этот БПФ для 1024point и 12bt". Внутренне FFT может сделать «нормализацию» внутри алгоритма, чтобы оставаться в пределах 16 -битной арифметики (например, различные сдвиги слева или сразу после конкретных математических операций). Я не так, как работает этот конкретный алгоритм.

Лучший способ изучить FFT ANF IFFT - использовать одиночную или двойную точность математики. Тогда вы увидите много деталей..

Rogerclark
Вт 14 июня 2016 г., 9:49
Пито написал: Насколько велики спектральные линии (фактическое значение FFT против сгенерированной амплитуды)?

Zoomx
Вт 14 июня 2016 г. 10:29 утра
Если я не ошибаюсь, FFT хорошо работает с функциями или кривыми, которые вы можете получить во всех точках.
Спилот не такая функция и квадратная волна. Но я не уверен.

Пито
Вт 14 июня 2016 г. 11:10
Поэтому существует функция «окна». WFUNCMAND «закрывает» образцы в входном массиве, такие как значения в начале, и в конце массива переходят в ноль. Если вы не используете WF, а ваши образцы сигнала запускаются и заканчиваются случайным образом, «острые» края входных значений (в начале и конце массива) создают огромное количество дополнительных спектральных компонентов после FFT, которые могут уничтожить ваши БПК спектры.
Для SW, сгенерированной синусом (и целочисленной FREQ, размножается его), вам не нужен WF, когда он начинается и заканчивается в нуле. Также другие периодические функции, которые подходят внутри массива и запуска и запуска с нулевым значением, не нуждаются в WF.
Случайные и не требуют периодических сигналов WF, в противном случае БПФ производит дрянные спектры.

https: // en.Википедия.org/wiki/window_function

Zoomx
Ср 15 июня 2016 г. 8:12
Таким образом, окончательная функция избегает резких краев, которые не являются деривативными точками? Я не знаю, прав ли я, для не Деривативных точек я имею в виду, что вы не можете получить функцию.

Пито
Ср 15 июня 2016 г. 8:59 утра
У вас могут быть острые края внутри образцов в окне образцов (т.е. как пилиная зубная волна или пульсная поезда). Но только образцы в начале и конец массива входных образцов должны плавно работать в сторону нуля.
Если нет, то FFT будет думать, что края (в начале и конец входного массива) представляют дополнительный сигнал, то есть прямоугольный или трапеции импульс, начиная с начала и заканчивая в конце входного массива, и FFT добавит его спектры к спектрам исходного сигнала.

Пито
Сб 9 июля 2016 г., 16:13
Antialiasing Filter - долгое время назад я использовал эти микросхемы Maxim (5 В и 3 В VDD, низкий проход эллиптики 8 -го порядка):

https: // таблицы данных.Максимунтегрирован.ком/ ... AX7407.PDF

Вы можете настроить частоту нижней части угловой угла:
1. Внешние часы (соотношение 1: 100)
2. Конденсатор, подключенный к GND при входе в такт (диод варикапа тоже для легкой настройки тоже работает).

Efftek
Вторник 31 января 2017 г., 17:41
Я собираюсь скачать библиотеку FFT и взглянуть на нее через несколько дней, когда я вернулся домой на солнце, но в то же время мне было интересно, является ли 1024 максимальный размер TWF для этой библиотеки? Я бы предпочел использовать TWF из 2048 образцов. Мое приложение - анализ вибрации с использованием акселерометра ADCL335. В основном я обрабатываю при 2560 образцах в секунду. 1024 Образцы дают спектры 512 бин от 0 до 1280 Гц, и я игнорирую последние 112 бунку. Затем это преобразуется в спектр скорости v = 2pi.фон.A, где F частота и ускорение. Это, и спектр ускорения рассказывает мне много о состоянии машин.

Мне не нужна скорость, так как я не отображаю данные в режиме реального времени, но мне нужно разрешение.

Ура, Стив.

Отверстия текут
Чт, 01, 2018, 18:30
Я знаю, что это старое, но я действительно хотел бы сделать это компиляцию на моей дешевой STM32F103C8T6...

Я надеюсь, что я прав в более быстром процессоре для большего количества бункеров, чем 16 МГц AVRS, так как я отбираю только небольшую часть аудиосиптрума для сигналов тревоги/оповещений. Вы знаете, тот вид, который вы слышите в центрах обработки данных для UPS, и т. Д. Я надеюсь, что если я не смогу заставить FHT работать, я могу эффективно использовать FFT с меньшей пропускной способностью звука (но приличный счет бункеров).

У меня есть Arduinofft Lib, работающий на ESP8266, но мне нужно отбор проб в районе 10 с/секунду, и я предпочитаю использовать F103, если это возможно.

Кто -нибудь получил этот код для составления на одной из этих досок в среде STM32Duino?

Тиа!

Стивестронг
Чт, 01, 2018, 20:11
[Отверстия текут - Чт, 01, 2018, 18:30] - Кто -нибудь получил этот код Скомпилировать одну из этих плат с окружающей средой STM32Duino?
Какой именно?

ZMEMW16
Пт 02 марта 2018 г. 9:12 утра
«Этот код», кажется, не связывает ни одного посуды ?
SRP

victor_pv
Пн, 05 марта 2018 г., 4:42
[ZMEMW16 - Пт, 02, 2018, 9:12 утра] - «Этот код», кажется, не связывает ни одного посуды ?
SRP
Я предполагаю, что он ссылался на код в первом посте.
Я только что проверил это сегодня, работает нормально. Мне пришлось переименовать файл из .с .ASM, но я использую Slaeber/Eclipse, а не Arduino IDE, так что это может быть чем -то заняться.
Я загрузил полную библиотеку DSP F1XX от STM и протестировал также 256 баллов и 64 балла FFT -функции, все прошло нормально.
Затем я добавил его в свой эскиз игрока Test Wav и отобразил результаты, также работает нормально, хотя мне, возможно, нужно что -то сделать с масштабированием, но код FFT определенно работает нормально в соответствии с первым сообщением.