реклама на сайте
подробности

 
 
> Спектральный анализ 44kHz stereo на STM32Fxxx..., Возможность и современный опыт сообщества?
KnightIgor
сообщение Feb 22 2017, 16:49
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Привет всем.

Первичный поиск по форуму дал мне не много результатов. Тема немного затрагивалась в 2013.

Вопросы:
- делал ли кто сабж,
- какой минимально возможный STM32F мог бы потянуть задачу спектрального анализа музыки 44kHz 16 бит стерео на предмет определения гармонии (скорее - доминирующего тона в каждый момент времени в медленных композициях); данные идут по I2S.

Спасибо за внимание.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Feb 27 2017, 13:25
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
romas2010
сообщение Feb 28 2017, 17:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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)+ экономия ОЗУ

Хотя возникает вопрос- а какже на контроктаве и субконтроктаве, там дельта частот очень маленькая?




Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - KnightIgor   Цитата(romas2010 @ Feb 28 2017, 19:43) Я ...   Feb 28 2017, 19:50
|- - Aleksandr Baranov   Цитата(KnightIgor @ Feb 28 2017, 14:50) Ч...   Feb 28 2017, 20:43
- - Obam   Нету у ТС пока "сопра"...   Feb 28 2017, 18:34


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 05:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016