Между фазовой и частотной модуляцией несомненно есть связь. В момент изменения фазы сигнала одновременно тут же меняется и мгновенная частота сигнала. Я нашел понятное для меня описание фазовой и частотной модуляции и их связь в статье http://www.dsplib.ru/content/pmfm/pmfm.html
Там есть формула (3), которая показывает, что мгновенная частота радиосигнала - это производная от его полной фазы:
(3)
Далее в той же статье приведены формулы (6) и (9), которые описывают радиосигнал при фазовой и частотной модуляции:
(6), фазовая модуляция
(9), частотная модуляция
Здесь, w0 - несущая частота, sm (t) - модулирующий сигнал, m и w1 - индексы модуляции.
Рассматривая эти формулы, я подумал, что если модулирующий сигнал проинтегрировать и подать на фазовый модулятор, то на выходе я получу точно частотно-модулированный сигнал. С другой стороны, интеграл от синусоидального сигнала будет косинусоидальным сигналом. Исходя из этого нужно ли вообще предварительно интегрировать?
В общем, я не претендую на особую научность моих изысканий. Давайте просто попробуем и посмотрим, что получится.
Я делаю проект для ПЛИС MAX10 платы Марсоход3bis, но, поскольку проект простой, он может быть с легкостью перенесен на другие ПЛИС, главное, чтобы там имелся PLL и можно было бы динамически менять фазу тактовой частоты. Весь проект можно взять на github: https://github.com/marsohod4you/Fpga-PM-Radio
В моем проекте ПЛИС имеется PLL с двумя выходными частотами и обе 100МГц. На частоте c0 работает вся логика проекта, а вот частота c1 будет прямо выходить на цифровой выходной пин ПЛИС. Точнее даже на два выходных пина, прямой и инверсный. К этим двум пинам я подключу два куска провода по 0,75 метра. Таким образом я получу антенну в виде "полуволновый вибратор". В самом деле, при частоте 100МГц длина волны 3 метра. Два четвертьволновых вибратора - это примерно полтора метра.
Сразу прошу прощения у тех, кто считает, что перед антеной нужен полосовой фильтр на излучаемый диапазон. Да нужен, но в данный момент я не проектирую реальный передатчик, просто делаю эксперименты, да и сама антена уже является фильтром. Плюс ко всему мощность излучения очень мала - так, только поиграться.
Далее, проект для ПЛИС будет принимать выборки аудио сигнала из последовательного порта. Я буду посылать в плату не сжатый аудио файл в формате Моно, 8 бит/выборку, 22050 выборок в секунду. Скорость порта я выбираю стандартную 230400 бит в секунду. Поскольку при последовательной передаче каждый байт содержит старт бит, восемь бит данных, один или два стоп бита, то как раз на приемном конце и получится 230400/11=20945 выборок в секунду. Это конечно не стандартные 22050, но как-то примерно похоже. Ожидаемый тон аудио будет чуть ниже, чем должен быть, процентов на 5..
Еще в проекте ПЛИС имеется восьмибитное число определяющее "текущую фазу" на выходе PLL c1. Разница между значением текущей фазы и принятым значением выборки из последовательного порта - это сколько шагов сдвига фазы нужно сделать. Специальная машина состояний выполняет нужный сдвиг фазы PLL сразу после приема выборки аудио сигнала.
Вообще, весь модуль довольно прост и написан на Verilog HDL:
module top(
input wire CLK100MHZ,
input wire key0,
input wire key1,
input wire FTDI_BD0, //serial RX line
output wire [19:0]io
);
wire wc0;
wire wc1;
wire wlocked;
wire wpdone;
wire up_down;
reg pstep;
wire scanclk; assign scanclk = wc0;
reg [7:0]cnt8;
always @( posedge scanclk )
cnt8 <= cnt8 + 8'h01;
mypll mypll_ (
.areset( ~key0 ),
.inclk0(CLK100MHZ),
.phasecounterselect( 3'b011 ),
.phasestep( pstep ),
.phaseupdown( up_down ),
.scanclk(scanclk),
.c0(wc0),
.c1(wc1),
.locked(wlocked),
.phasedone( wpdone )
);
wire [7:0]w_rx_byte;
wire w_byte_ready;
reg [1:0]byte_rdy;
always @( posedge wc0 )
byte_rdy <= {byte_rdy[0],w_byte_ready};
serial receiver(
.reset( ~wlocked ),
.clk100( wc0 ), //100MHz
.rx( FTDI_BD0 ),
.sbyte( 8'h00 ),
.send( 1'b0 ),
.rx_byte( w_rx_byte ),
.rbyte_ready( w_byte_ready ),
.tx(),
.busy(),
.rb()
);
reg [7:0]current_pll_phase = 0;
wire [7:0]signal; assign signal = w_rx_byte[7:0];
assign up_down = signal>current_pll_phase;
reg [3:0]state = 0;
always @( negedge scanclk )
begin
case(state)
0: begin
//wait recv byte
if( byte_rdy ) state <= 1;
end
1: begin
//do we really need to change phase?
if( current_pll_phase==signal ) state <= 0;
else state <= 2;
end
2: begin
//wait phase done
if( ~wpdone ) state <= 3;
end
3: begin
state <= 4;
end
4: begin
state <= 1;
end
endcase
if( pstep && (~wpdone) )
if( up_down )
current_pll_phase <= current_pll_phase + 6'h1;
else
current_pll_phase <= current_pll_phase - 6'h1;
if( ~wpdone )
pstep <= 1'b0;
else
if( state==2 )
pstep <= 1'b1;
end
assign io[17:0] = 0;
assign io[18] = wc1; //antenna pin0
assign io[19] = ~wc1; //antenna pin1
endmodule
В проекте используется PLL, в котором при настройке в мегавизарде установлен флажок "enable phase shift step resolution". При этом, внутренняя максимальная частота PLL, Fvco=1300MHz, а минимальный достижимый фазовый сдвиг частоты можно получить в 96,15 пикосекунд. Фазу выходной тактовой частоты PLL можно динамически сдвигать на один шаг (96ps) за цикл изменения фазы. Когда приходит новая выборка аудиофайла схема вычисляет, сколько нужно сделать шагов по изменению фазы и в какую сторону делать эти шаги, сдвигать фазу частоты вперед или назад. Потом делаются эти сдвиги и ожидается следующая выборка аудио.
Ну и конечно, вот видеодемонстрация, как работает передатчик с фазовой модуляцией:
Здесь видно, что пока проект не загружен в ПЛИС, то радиоприемник FM в мобильном телефоне довольно сильно шумит на частоте 100МГц. После загрузки проекта в ПЛИС шум в радиоприемнике смолкает, так как в эфире появляется несущая частота. Затем, я открываю программу терминала TeraTerm, настраиваю последовательный порт и начинаю передачу аудио файла. Файл аудио подготовлен в формате 8 бит моно, 22050Гц в программе Audacity.
Я слушаю композицию "Podington Bear" с сайта http://freemusicarchive.org/music/Podington_Bear/
Во время передачи аудиофайла через последовательный порт в плату Марсоход3bis с проектом фазового модулятора в радиоприемнике слышна эта композиция.
ЗЫ: кстати, скоро, 7-го мая, мы отмечаем "День Радио". Думаю этот проект будет как раз кстати.
Подробнее...