Двоичная фазовая манипуляция в Python - PullRequest
6 голосов
/ 19 сентября 2011

В настоящее время я работаю над некоторым кодом для передачи сообщений / файлов / и других данных через лазеры с использованием преобразования звука. Мой текущий код использует функцию hexlify из модуля binascii в python для преобразования данных в двоичный файл, а затем издает тон для 1 и другой тон для 0. Это в теории работает, хотя и не самый быстрый способ кодировать / декодировать , но в тестировании оказывается несколько ошибок.

  1. генерируемые тоны не являются точными, то есть: излучение 150 Гц может оказаться равным 145-155 Гц на приемной стороне, это не является большой проблемой, так как я могу просто установить границы на приемной стороне ниже или выше.

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

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

Я рассмотрел это дальше, и решение этого вопроса может заключаться в том, что оно может включать BPSK или двоичную фазовую манипуляцию, хотя я не уверен, как это реализовать. Любые предложения или примеры кода будут оценены!

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

Спасибо! : -)

Ответы [ 2 ]

7 голосов
/ 19 сентября 2011

Взгляните на GNU Radio!

http://gnuradio.org/redmine/projects/gnuradio/wiki

GNU Radio - это проект, позволяющий в программном обеспечении максимально возможной передачи или приема радиосигнала.Поскольку радио уже использует фазовую манипуляцию, ребята из GNU Radio уже решили эту проблему для вас, а GNU Radio уже является проектом Python!А сложные DSP написаны на C ++ для скорости, но упакованы для использования в Python.

Вот страница, на которой обсуждается проект, использующий дифференциальную двоичную фазовую манипуляцию (DBPSK) / дифференциальную квадратурную фазовую манипуляцию (DQPSK)для передачи двоичных данных (в примере, изображения JPEG).Исходный код Python доступен для скачивания.

http://www.wu.ece.ufl.edu/projects/softwareRadio/

Я вижу, что ваш проект находится под лицензией MIT.GNU Radio работает под GPL3, что может быть проблемой для вас.Вам нужно выяснить, можете ли вы использовать GNU Radio без необходимости превращать ваш проект в производную работу, заставляя вас сменить лицензию.Должна быть возможность создать автономный «отправляющий демон» и автономный «принимающий демон», исходным кодом которого будет GPL3, а затем подключить к ним ваш код MIT через сокет или что-то в этом роде.

Кстати, один из моих поисков нашел это очень четкое объяснение того, как работает BPSK:

http://cnx.org/content/m10280/latest/

Удачи!

4 голосов
/ 19 сентября 2011

В ответ на первый вопрос о частоте:

Глядя на ваш декодер, я вижу, что ваша частота дискретизации равна 44100, а размер фрагмента равен 2048. Если я правильно читаю это, это означает, что ваш размер FFT равен 2048. Это означает, что размер корзины FFT равен ~ 21 Гц. Вы пытались обнулить БПФ? Нулевое заполнение FFT не изменит частоту, но даст вам лучшее разрешение. Я вижу, что вы используете квадратичную интерполяцию для улучшения вашей оценки частоты. Я не использовал эту технику, поэтому я не знаком с улучшением, которое вы получаете от этого. Возможно, баланс между заполнением нулями и выполнением квадратичной интерполяции даст вам лучшую точность частоты.

Кроме того, в зависимости от аппаратного обеспечения, осуществляющего передачу и прием, погрешность частоты может быть результатом различных тактовых импульсов, управляющих аналого-цифровым сигналом. Один или оба тактовых генератора не имеют частоту 44100 Гц. Нечто подобное может повлиять на частоту, которую вы видите на выходе FFT.

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