Обновить

Комментарии 19

7. Обычно, база ЛЧМ - это около 30% центральной частоты. Например, центральная - 10кГц, тогда ваш сигнал от 8.5 до 11.5кГц. Но я говорю про гидроакустику, и это не железное правило, а скорее особенность излучателей, которые достаточно узкополосные. Думаю, вам тоже следует придерживаться этих ограничений, потому что ваш излучатель на 1 и 10 кГц будет иметь разную диаграмму направленности.

8. Если генерить сигнал для пьезика на высокой частоте - то так и надо делать, дёргать пином драйвер пьезика. А уже потом электрически драйвер согласовывать с излучателем.

9. Мы используем H7 серию. Но честных и чистых 16 бит там не добьётесь. Да и не надо. 14 бит дают приемлемый динамический диапазон. Ддя ваших экспериментов этого процика - за глаза. Для обычных сонаров нам хватает L412, который при хорошей оптимизации тянет ЛЧМ реалтайм.

P.S. когда приводите значения скорости звука, уточняйте, пожалуйста, для какой среды эти значения.

Обычно, база ЛЧМ - это около 30% центральной частоты. Например, центральная - 10кГц, тогда ваш сигнал от 8.5 до 11.5кГц. 

А какую указать длительность CHIRP импульса?

Обычно, база ЛЧМ - это около 30% центральной частоты. Например, центральная - 10кГц, тогда ваш сигнал от 8.5 до 11.5кГц. 

Я попробовал и такие настройки ЛЧМ-импульса.
Результат примерно то же что и прежде. Хорошо видно забор

Тот же ЛЧМ только без окна Хэмминга. Радиоголограмма выглядит выразительнее.

У меня как-то были похожие мысли. Если взять длинный код (например, коды Голда), постоянно его передавать и принимать (может даже без несущей частоты), то можно в любой момент времени увидеть все отраженные сигналы. В STM32G431 (наверняка и в других) есть аппаратный свёрточный фильтр

А еще, если использовать несколько излучателей/приемников, можно управлять направлением луча, сканируя пространство

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

Согласен, в таком случае нужен компромисс между частотным сдвигом и максимальной дальностью

 В STM32G431 (наверняка и в других) есть аппаратный свёрточный фильтр

Да, в STM32G431 в самом деле заложен аппаратный FIR фильтр. Не знал. Спасибо @Dozer88 .Однако порядком этот FMAC всего лишь до 256.
При этом для нормального сонара надо, чтобы порядок фильтра составлял хотя-бы 2048. В 10 раз больше!
https://www.st.com/resource/en/reference_manual/rm0440-stm32g4-series-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

При fir порядка 256 на звуке 48к можно будет использовать chirp импульсы не длиннее чем 5ms. Это мало.

Если можно через FFT, зачем FIR с n*n умножениями? Нужна низкая задержка?

Если можно через FFT, зачем FIR с n*n умножениями? Нужна низкая задержка?

У вас есть исходный Си-код функций fft ifft, таких, чтобы в реализации не было динамического выделения памяти и рекурсии?

Вот тут есть, по степеням двойки вплоть до 8192. Тригонометрические таблицы уже посчитаны и внедрены в код. Реализация неитеративная, некоторые циклы уже развёрнуты. Авторы утверждают, что их реализация обходит даже FFTW (при прочих равных). Библиотеку разрабатывали специально для встраиваемых систем.

Я тут попробовал для своего сонара рассчитать свертку зондирующего импульса и записи эхо не коррелятором, а при помощи дискретного преобразования Фурье.Согласно теореме о свертке.
https://en.wikipedia.org/wiki/Convolution_theorem

дак у меня программа даже на PC зависла.
Входные данные очень уж больше.
Зондирующий импульс 2400 сэмплов в длину.
Записанный сигнал - две секунды звука на 48kHz. Это 96000 семплов во временной области.
Исходные сигналы для DFT оба 96000 семплов во временной области.
Мне придется на ночь компьютер оставлять работать, чтобы он досчитал.

Если можно через FFT, зачем FIR с n*n умножениями? Нужна низкая задержка?

Ответ тут.

https://docs.google.com/document/d/1dn7XiD1gflNLa3Fa8uzHeuW7kcJkWXkZej6qxXRT84k/edit?tab=t.0

Пока не получается.

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

И вычислить свертку по этой формуле

iDFT{    DFT( принятый сигнал) * [     комплексное сопряжение(  DFT(импульсный ЛЧМ-сигнал)   )    ]    }

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

Опорный сигнал у меня:961 семплов 
Входная запись эхо:52800 семплов 
Я выровнял два сигнала до длины 53760 семплов
Как и было сказано в учебника Стивена Смитта “Цифровая Обработка Сигналов “

Количество гармоник, которые я рассчитываю равно 53759.

Вместо быстрого преобразования Фурье я использовал дискретное преобразования Фурье. Скорость вычислений меня пока не беспокоит. Хотелось бы просто получить корректный результат.

Однако на выходе iDFT я получил совсем не похожий результат на ту первоначальную светку, которую я предварительно на тех же данных рассчитал при помощи обыкновенного коррелятора.
Коррелограмма вычисленная при помощи преобразования Фурье совсем не совпадает с коррелограммой вычисленной при помощи коррелятора. FIR-фильтр работал, а DFT-метод нет.

Вот код вычисления DFT
https://github.com/aabzel/trunk/blob/main/source/computing/dsp/dft/dft.c

Вот функция sonar_dft_convolution вычисления свертка через DFT
https://github.com/aabzel/trunk/blob/main/source/applications/sonar/sonar.c
Где же ошибка?

Если можно через FFT, зачем FIR с n*n умножениями? 

Добавил и возможность вычислять свертку через FFT.
Получилось в 13 раз быстрее чем FIR фильтром!

bool sonar_fft_convolution(const char* const pulse_file_name, 
                           const char* const rec_file_name)

https://github.com/aabzel/trunk/blob/main/source/applications/sonar/sonar.c

Лог отработки программы

Свёртку с нулевой задержкой можно делать через FFT - для этого есть специальные алгоритмы. На настольном компьютере я проверял свёртку в реальном времени на 1М семплов при чд 48К (примерно 20 секунд реверберационного импульса) - работало без заиканий. И это не предел, потому что на оптимизацию не заморачивался. На современном смартфоне результат будет чуть хуже, но не на порядки.

Свёртку с нулевой задержкой можно делать через FFT - для этого есть специальные алгоритмы. 

Я тут посмотрел теорему о свёртке, посмотрел формулу обратного дискретного преобразования Фурье и увидел, что результат операции iDFT -  это массив комплексных чисел. Ибо умножение комплексного числа на комплексное число это, в общем случае, тоже комплексное число.

https://ru.dsplib.org/content/dft/dft.html

формула (21)

Одновременно с этим, по определению свертка двух функций -  это функция одной переменной. То есть массив действительных чисел. 

И как же мне после iDFT получить свёртку в виде массива действительных чисел?

1—выбрать действительную часть от от результата  iDFT
2—выбрать мнимую  часть от от результата  iDFT
3—выбрать модуль  от от результата  iDFT
4—выбрать аргумент от от результата  iDFT

5—другое

  1. Когда вы делаете DFT над действительными числами - то получаете комплексно-сопряжёные числа для противоположных по знаку частот. При перемножении они также останутся комплексно-сопряжёными, поэтому после обратного DFT мнимая часть будет равна нулю плюс-минус погрешности вычислений (в районе 1е-14).

Существует специальная версия ЛЧМ, спектр которой равен константе на всех частотах (за счёт того, что он генерируется через обратное преобразование Фурье). Это значит, что его автокорелляция будет строго единичным импульсом без каких-либо боковых лепестков. Используя технологию дизеринга, его можно дискретизировать вплоть до 1-го бита, а для корреляции использовать инверсию его спектра уже после квантования (а не просто разворачивать во времени).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации