|
Спектральный анализ 44kHz stereo на STM32Fxxx..., Возможность и современный опыт сообщества? |
|
|
|
 |
Ответов
|
Feb 27 2017, 13:25
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(KnightIgor @ Feb 22 2017, 18:49)  Привет всем, again. Во многих темах спрашивающие в итоге ничего не пишут о своих результатах, удалось ли побороть. В интересных случаях меня это огорчает. Поэтому напишу о своих промежуточных результатах, если кому интересно. 1. Пока остановился на "белых" клавишах малой, первой и второй октав. Всего 21 нота/частота. Частоты получаются: 131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880, 988 2. Применяю Гёрцеля. Описано, например, здесь, с кусками кода. Коэффициенты для каждой частоты посчитаны в Excel и занесены константами в код. Таким образом, синусы и косинусы не вызываются. 3. Предварительно исходный поток стерео с 44.1kHz 16-ти битных выборок я прореживаю до 2205Hz частоты стерео выборок. Для этого DMA просто складывает поток из I2S по кольцу в двойной буфер размером на 20 стереовыборок на каждый буфер, в результате прерывания от DMA (HT/TC) идут c требуемой частотой в 2205Hz. По этим прерываниям происходит усреднение всех 20-ти стереовыборок соответствующего буфера и запись результата в накопительный двойной буфер для Гёрцеля размером 222 выборки каждый. На такую операцию (прерывание) уходит про всё 10мкс. Перед записью идет масштабирование из 16-бит в диапазон [0..100]. Почему? Изначально я сделал так исходя из кода примера (там генегируются тестовые последовательности в диапазоне амплитуд [0..100]). Когда же вернулся к полному диапазону, "узнаваемость" нот ухудшилась. 4. Эти 222 выборки произошли от желания получить разрешение в 10Hz (2205/10=221) с округлением вверх до четного числа (с нечетным 221 получались странные результаты, не стал углубляться). 5. После примерно 100мс один из буферов Гёрцеля заполняется, и происходит запуск поиска указаных частот по этому буферу. Поиск ведется из синхронного цикла (система типа round robin условно многозадачная, кооперативная и синхронная, похожа на protothreads) и разделен на этапы с поиском одной частоты из 21 за этап. Общее время обработки буфера - примерно 35мс, то есть треть от времени заполнения буфера. Результат - массив значений амплитуд для всех 21 нот. Это на STM32F103 на 72MHz, загрузка побочная небольшая. 6. Для выделения доминирующего тона происходит усреднение амплитуд для каждой ноты из трех октав (мне нужно знать имя ноты, а не точно, какой октаве она принадлежит), то есть, усреднение трех гармоник каждой ноты, после чего находится максимум из 7-ми значений. Чистые ноты (эмуляция пианино на смартфоне) распознаются достаточно хорошо. Пока так. Займусь FFT для сравнения. P.S. Нашел ошибочку, после чего масштабирование в [0..100] убрал, все распознается хорошо. Время поиска сократилось с 35мс до 20мс. Не любит процессор байтные диапазоны и операции. P.P.S. Заметочка на полях: если I2S запрограммирован на вход (приём) как ведомый (slave), а I2S сигналы на входе CPU уже активны (внешний источник рубает вовсю), то разрешение I2S интерфейса следует засинхронизировать к сигналу LRCK (WS в терминах документации на STM32F), а именно разрешать I2S, пока LRCK = 1, то есть - ДО ниспадающего фронта на нем. Иначе происходит нарушение битовой синхронизации, и прием данных идет со сдвигом. Самый тупой метод синхронизации перед установкой бита I2SE - синхронное ожидание перепада LRCK с 0 в 1.
Сообщение отредактировал KnightIgor - Feb 28 2017, 11:40
|
|
|
|
|
Feb 28 2017, 17:43
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Цитата(KnightIgor @ Feb 27 2017, 16:25)  Привет всем, again.
1. Пока остановился на "белых" клавишах малой, первой и второй октав. Всего 21 нота/частота. Частоты получаются: 131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880, 988
.......... Пока так. Займусь FFT для сравнения. Я бы рискнул все-таки через БПФ, но при этом 1) 4096 выборок, соответственно дискрета по частоте 44100/4096 ~=11 Гц ОЗУ надо 32к (4096*(float Re+float Im)) 2) Табличный синус, а косинус-это синус,сдвинутый на pi/2, то есть на cos[x]=sin[x+1024] 3) бабочки БПФ написать на ассемблере с командами сопроцессора 4) DMA I2S не использовать,а вычитывать в каждом прерывании I2S выборку и сразу же кинуть в буфер отсчётов БПФ с бит-реверсией адреса(есть у М4 __rbit() intrinsic)+ экономия ОЗУ Хотя возникает вопрос- а какже на контроктаве и субконтроктаве, там дельта частот очень маленькая?
|
|
|
|
|
Feb 28 2017, 19:50
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(romas2010 @ Feb 28 2017, 19:43)  Я бы рискнул все-таки через БПФ, но при этом 1) 4096 выборок, соответственно дискрета по частоте 44100/4096 ~=11 Гц ОЗУ надо 32к (4096*(float Re+float Im)) 2) Табличный синус, а косинус-это синус,сдвинутый на pi/2, то есть на cos[x]=sin[x+1024] 3) бабочки БПФ написать на ассемблере с командами сопроцессора 4) DMA I2S не использовать,а вычитывать в каждом прерывании I2S выборку и сразу же кинуть в буфер отсчётов БПФ с бит-реверсией адреса(есть у М4 __rbit() intrinsic)+ экономия ОЗУ
Хотя возникает вопрос- а какже на контроктаве и субконтроктаве, там дельта частот очень маленькая? 1). Не слабо так, 32К. На моем F103 - всего 48K. Ну, должно хватить, т.к. другие задачи не прожорливые. 2). Это реально. 3). Нету сопроцессора. Разбаловались тут все на F4xx.... 4). I2S прерывания идут в 2*44.1K, т.к. сигнал - стерео. Это каждые 12мкс. Проц зашьется. Говорить об экономии ОЗУ здесь, выделив сразу 32К в пункте 1)., есть несколько непоследовательно  . 5). Да, уже в малой октаве между ми и фа - 9.8Hz, а глубже - меньше. Что имеется ввиду под бит-реверсией адреса?
|
|
|
|
Сообщений в этой теме
KnightIgor Спектральный анализ 44kHz stereo на STM32Fxxx... Feb 22 2017, 16:49 _pv fft у кортексов очень грубо говоря - 100 тактов на... Feb 22 2017, 17:09 KnightIgor Цитата(_pv @ Feb 22 2017, 19:09) STM32 аб... Feb 22 2017, 20:57 KnightIgor Цитата(_pv @ Feb 22 2017, 19:09) Отдельны... Feb 23 2017, 10:21  _pv Цитата(KnightIgor @ Feb 23 2017, 16:21) М... Feb 23 2017, 11:13   KnightIgor Цитата(_pv @ Feb 23 2017, 13:13) Герцелю ... Feb 23 2017, 11:33    _pv Цитата(KnightIgor @ Feb 23 2017, 17:33) Я... Feb 23 2017, 12:21     KnightIgor Цитата(_pv @ Feb 23 2017, 14:21) Нет, 230... Feb 23 2017, 16:56    khach Цитата(KnightIgor @ Feb 23 2017, 14:33) н... Feb 23 2017, 12:22 Obam На we.easyelectronics.ru года 3 назад делали цвето... Feb 22 2017, 18:26 khach Берите семерки STM32F746 или STM32F769 - там и ... Feb 22 2017, 19:05 Allregia Цитата(khach @ Feb 22 2017, 20:05) Берите... Feb 23 2017, 05:10  KnightIgor Цитата(Allregia @ Feb 23 2017, 07:10) Смо... Feb 23 2017, 09:20 Genadi Zawidowski Тогда точно придется утаптывать в целочисленку... ... Feb 22 2017, 21:19 khach Спектроанализатор, блютус, USB, I2S на одном камне... Feb 23 2017, 10:04 jcxz Цитата(khach @ Feb 23 2017, 12:04) Как пр... Feb 23 2017, 17:43  KnightIgor Цитата(jcxz @ Feb 23 2017, 19:43) Странно... Feb 24 2017, 09:04   jcxz Цитата(KnightIgor @ Feb 24 2017, 11:04) З... Feb 24 2017, 15:28 Allregia Цитата(khach @ Feb 23 2017, 11:04) Спектр... Feb 24 2017, 09:23 khach Проблемы были не со скоростью а с памятью- буфера ... Feb 24 2017, 10:40 Allregia Выводить спектроанализатор - не кино смотреть (и н... Feb 24 2017, 11:04   Aleksandr Baranov Цитата(KnightIgor @ Feb 28 2017, 14:50) Ч... Feb 28 2017, 20:43 Obam Нету у ТС пока "сопра"... Feb 28 2017, 18:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|