Двоичная фазовая манипуляция в Python
в настоящее время я работаю над некоторым кодом для передачи сообщений/файлов/и других данных через лазеры с использованием преобразования звука. Мой текущий код использует функцию hexlify из модуля binascii в python для преобразования данных в двоичный, а затем выдает тон для 1 и другой тон для 0. Это теоретически работает, хотя и не самый быстрый способ кодирования / декодирования, но в тестировании оказывается несколько ошибок.
генерируемые тоны не являются точечными, т. е.: излучающими 150Hz может оказаться 145-155Hz на приемном конце, это не огромная проблема, поскольку я могу просто установить границы на приемном конце ниже или выше.
реальная проблема заключается в том, что если я испускаю тон, и он воспроизводится, компьютер на принимающей стороне может прочитать его несколько раз или не читать его вообще на основе скорости, с которой он сэмплирует входящий звук. Я попытался воспроизвести тоны с той же скоростью, что и образцы, но это очень сомнительно.
In все, у меня было несколько успешных запусков с использованием коротких сообщений, но это очень ненадежно и неточно из-за вышеупомянутых проблем.
Я рассмотрел это дальше, и решение этого выглядит так, как будто оно может включать BPSK или двоичную фазовую манипуляцию, хотя я не уверен, как это реализовать. Любые предложения или примеры кода будут оценены!
мой код для этого проекта можно найти здесь но основные файлы я работаю для двоичное декодирование и кодирование, которое здесь и здесь. Я не эксперт в python, поэтому, пожалуйста, простите меня, если что-то я сказал неправильно, мой код не лучший, или если я пропустил что-то основное.
спасибо! :-)
2 ответов
взгляните на GNU Radio!
http://gnuradio.org/redmine/projects/gnuradio/wiki
GNU Radio-это проект, который в программном обеспечении должен как можно больше передавать или принимать радиосигналы. Поскольку радио уже использует фазовую манипуляцию, ребята GNU Radio уже решили проблему для вас, и GNU Radio уже является проектом Python! И сложный материал DSP написан на C++ для скорости, но обернут для использования в Питон.
вот страница, обсуждающая проект с использованием дифференциальной двоичной фазовой манипуляции (DBPSK) / дифференциальной квадратурной фазовой манипуляции (DQPSK) для передачи двоичных данных (в примере изображения JPEG). Исходный код Python доступен для скачивания.
http://www.wu.ece.ufl.edu/projects/softwareRadio/
Я вижу, что ваш проект находится под лицензией MIT. GNU Radio находится под GPL3, что может быть проблемой для вас. Вы должны понять если вы можете использовать GNU Radio без необходимости превращать ваш проект в производную работу, тем самым заставляя вас менять лицензию. Должно быть возможно сделать автономный " отправляющий демон "и автономный" принимающий демон", оба из которых исходный код будет GPL3, а затем ваш код MIT подключится к ним через сокет или что-то еще.
кстати, один из моих поисков нашел это очень четкое объяснение того, как БПБК работает:
http://cnx.org/content/m10280/latest/
удачи!
в ответ на первый вопрос по поводу частоты:
глядя на ваш декодер, я вижу, что частота дискретизации составляет 44100, а размер куска-2048. Если я читаю это правильно, это означает, что ваш размер БПФ-2048. Это положило бы ваш размер ящика FFT на ~21hz. Вы пытались обнулить свой БПФ? Обнуление FFT не изменит частоту, но даст вам лучшее разрешение. Я вижу, что вы используете квадратичную интерполяцию для улучшения оценки частоты. Я я не использовал эту технику, поэтому я не знаком с улучшением, которое вы получаете от этого. Возможно, баланс между нулевым заполнением и квадратичной интерполяцией позволит вам повысить точность частоты.
также, в зависимости от оборудования делая передачу и получать, ошибка частоты может быть результатом различных часов управляя A/D - одно или оба из часов нет на точно 44100Hz. Что-то подобное может повлиять на частоту, которую вы видите на выходе FFT.