Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сдвиг частотного спектра с помощью МДКП (MDCT). Прошу помочь.
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
ZeroQu
Задача: передать аудиосигнал по аналоговому каналу, который плохо проводит сигналы аудиочастот. Для этого входной аудиосигнал преобразовать в спектр, изменить этот спектр (сдвинуть и сжать/растянуть) и затем обратно преобразовать в аудио. На удаленном конце сделать обратную процедуру.

Решено было использовать Модифицированное Дискретное Косинусное Преобразование, т.к. оно позволяет склеивать соседние куски при обработке.

Все это делается на микроконтроллете STM32F103RET6. Есть DSP-библиотека от ST, из которой позаимствована функция БПФ (на 64 отсчета). В интернете так же нашел реализацию МДКП через БПФ. smile3046.gif

Работает это так. АЦП непрерывно молотит данные в буфер длиной 4N. Когда половина заполняется - возникает прерываение и первые 2N отсчетов поступают в функцию МДКП (в это время АЦП заполняет вторую часть буфера). Функция МДКП формирует массив длиной 4N: первая половина - вход АЦП от предыдущего(!) вызова функции; вторая половина - то что только что получили из буфера АЦП (оно же сохраняется для следующего вызова МДКП). Затем накладывается окно Ханна (т.е. просто полпериода синуса).

Затем собственно само МДКП: сдвиг на 1/4; преротация (подготовка к БПФ; из 4N отсчетов получаем N комплексных числа); само БПФ; постротация; сортировка.

Потом, по идее, должно идти преотразование спектра. Но пока тут ничего не делаю.

Затем оМДКП (все аналогично МДКП; на выходе имеем 4N отсчетов).

На эти выходные 4N значений опять накладываем такое же окно, и к первой половине прибавляем вторую половину, но от предыдущего вызова функции. А вторую половину, соответственно, сохраняем для следующего вызова.

Я проверял все это на синусоидальном входном сигнале.

Проблема заключается в том, что алгоритм нормально работает только когда во входных (для МДКП) 2N отсчетах помещается целое количество периодов входного сигнала. Как быть? Я знаю, что МДКП применяется, например в OGG Vorbis, и вроде бы даже в простом MP3.

Уважаемые форумчане, прошу подсказать: cranky.gif

1. Как работает МДКП, когда на входе произвольный сигнал? Правильно ли я использую наложение окон?

2. Можно ли добитсья поставленной цели другим путем? Нужно перевести в частотную область, там преобразовать определенным образом, и потом перевести обратно во временную. При этом чтобы голос был нормально слышен.

связист
А может быть надо просто сдвинуть спектр в ту область, которая хорошо передаётся по каналу связи. Затем передать сигнал. И после этого сдвинуть обратно. Сделать это можно очень просто во временной области, при этом не используя ни МДКП, ни БПФ, ни какое-либо другое подобное преобразование.
Не понятно для чего нужно играть со спектром - сжимать и разжимать его.
ZeroQu
связист, вы не могли бы сказать, как можно сдвинуть спектр во временной области? Буду благодарен. Не очень разбираюсь в ЦОСе.


Сжимать/разжимать спектр предполагается для того, чтобы как можно лучше "вписаться" в характеристики линии передачи. Одновременно со сдвигом спектра предполагается и увеличение частоты семплирования на удаленном конце.

bahurin
Цитата(ZeroQu @ Aug 4 2011, 13:57) *
связист, вы не могли бы сказать, как можно сдвинуть спектр во временной области? Буду благодарен. Не очень разбираюсь в ЦОСе.


Сжимать/разжимать спектр предполагается для того, чтобы как можно лучше "вписаться" в характеристики линии передачи. Одновременно со сдвигом спектра предполагается и увеличение частоты семплирования на удаленном конце.


Сигнал сдвигается по частоте при помощи модулятора. Читай здесь
связист
Цитата(bahurin @ Aug 4 2011, 14:11) *
Читай здесь


Помойму здесь написано слишком запутанно, хотя, наверное, достаточно полно и проще, наверное, суть явления объяснить не получится.
Если сказать то же самое в двух словах, то надо сделать так:
1. получить из исходного сигнала аналитический сигнал;
2. умножить аналитический сигнал на комплексную синусоиду нужной частоты (это и будет собственно сдвиг частоты);
3. получить из сдвинутого аналитического сигнала вещественный сигнал (отбросить мнимую часть).
Не знаю стало ли понятнее после таких объяснений, но в любом случае Вам надо копать в сторону ЦОС если хотите дальше написать программу и чтобы она при этом заработало.

Вот кстати в соседней ветке такую же тему обсуждают.
http://electronix.ru/forum/index.php?showtopic=92947
ZeroQu
О... Я, похоже, попал =)
Спасибо за наводки! Постараюсь постичь всю эту заумь.
ivan219
ZeroQu смотрите на рисунок.
Материал взять отсюда http://www.dsplib.ru/content/hilbertquad/hilbertquad.html
Тут главное правильно подобрать ФНЧ с хорошим подавлением не нужной полосы. И с нужными вам параметрами.
ZeroQu
Иван, спасибо! Надо пробовать.
SPACUM
Цитата(ZeroQu @ Aug 4 2011, 12:23) *
Задача: передать аудиосигнал по аналоговому каналу, который плохо проводит сигналы аудиочастот. Для этого входной аудиосигнал преобразовать в спектр, изменить этот спектр (сдвинуть и сжать/растянуть) и затем обратно преобразовать в аудио. На удаленном конце сделать обратную процедуру.

Автор нигде не указал, что не хватает полосы пропускания, значит обычная амплитудная модуляция вполне подойдет и можно сэкономить контроллер. А использование одной боковой полосы - это лишь экономия полосы в 2 раза. Неужели такая малость все приведет в норму?
А если полосы пропускания нет, то и сдвигать некуда.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.