首先FM調(diào)制時屬于非線性調(diào)制中的一種,常見的非線性調(diào)制時FM(頻率調(diào)制),PM(相位)調(diào)制
FM調(diào)制:就是利用調(diào)制信號的變化去改變載波的頻率,幅度保持不變,即載波信號的頻率隨我們調(diào)制信號的幅度變化而變化。
首先我們先介紹一些通信原理上的基本得概念:
現(xiàn)在FM調(diào)制就是我們將我們的基帶信號替換位其φt,但是我們會在其基帶信號的前面乘以一個調(diào)頻系數(shù),也叫調(diào)頻靈敏度。這就通過我們基帶信號的振幅,改變其載波的頻率,這樣就是實現(xiàn)了頻率調(diào)制。下面我們假設(shè)基帶信號為一個余弦波:
上述就是其FM 調(diào)制的數(shù)學(xué)式子,這就實現(xiàn)了其FM 調(diào)制
這里說明上圖中的積分轉(zhuǎn)化為求和,因為積分是我們的連續(xù)域的,而我們的這都是數(shù)字信號,都是連續(xù)域,這就相當(dāng)于我們的信號與系統(tǒng)中的傅里葉變化對應(yīng)連續(xù)域,Z變化對應(yīng)離散域。所以連續(xù)域的積分對應(yīng)到離散域就是求和。
IQ調(diào)制:現(xiàn)代通信系統(tǒng)為了使頻譜利用率更高,用了許多種矢量調(diào)制,IQ調(diào)制中,兩個正交信號(頻率相同,相位相差90 °的載波,一般用Sin和Cos表示)與I(In-Phase,同相分量)、Q(Quadrature Phase,正交分量)兩路信號分別調(diào)制后一起發(fā)射,從而提高頻譜利用率。
所以接下來我們要將上式轉(zhuǎn)為IQ兩路,然后利用天線進(jìn)行發(fā)送
我們I路信號為:cos ,圖中的cos(wt) 為載波信號
我們Q路信號為:sin , 圖中的sin(wt) 為載波信號
FM解調(diào):
相干解調(diào):相干解調(diào)也叫同步檢波,它適用于所有線性調(diào)制信號的解調(diào)。實現(xiàn)相干解調(diào)的關(guān)鍵是接收端要恢復(fù)出一個與調(diào)制載波嚴(yán)格同步的相干載波。相干解調(diào)是指利用乘法器,輸入一路與載頻相干(同頻同相)的參考信號與載頻相乘。
非相干解調(diào):通信接收端從已調(diào)高頻信號中恢復(fù)出原始數(shù)字基帶信號時,采用的非相干解調(diào)方式,相對于相干解調(diào)方式,是指不需要提取載波信息的一種解調(diào)方法。
所謂相干,泛泛地說就是相互干擾;相干解調(diào)是指利用乘法器,輸入一路與載頻相干(同頻同相)的參考信號與載頻相乘。
這里的解調(diào)是運用的非相干解調(diào):
我們將上述的調(diào)制信號分別乘以coswt,-sinwt,就可以得到相應(yīng)的IQ路的數(shù)據(jù),然后分別通過一個低通濾波器,濾除高頻分量,就可以的得到以基帶信號為頻率的I路Q路載波信號,然后兩個再相比,就可以得到其正切值,再求反正切就可以了的到其角度,角度就是我們的基帶信號。
這里的微分在離散域其實就是我們的相連的數(shù)據(jù)求差分。所以我們直接就可以求得基帶信號m.
FM調(diào)制matlab實現(xiàn)。
說明:因為后續(xù)會用硬件FPGA 實現(xiàn),所以matlab 實現(xiàn)實現(xiàn)算法也會像盡可能的逼近其硬件。
思路:
產(chǎn)生基本的信號:基帶信號m(n),載波cos(wt),sin(wt)的實現(xiàn)
我們這里實現(xiàn)信號發(fā)生器是用的查表法,即FPGA,MATLAB 產(chǎn)生DDS,這里就不說明其方法了,相關(guān)信息可以看我發(fā)的其他博客,里面有詳細(xì)的教程,以及原理介紹。
下面就是FM調(diào)制解調(diào)代碼:
clc;
clear all;
%*****************************************
fs = 16e6; %采樣率 載波的采樣率
fc = 1e6; %載波中心頻率
df = 75e3; %最大頻偏
fm = 16e3; %音頻的采樣率
kf = (df*2^32/fs)/32767;
AC= 1024;%幅度
%由于我們的載波的采樣率是我們的音頻的采樣率的1000倍,但是我們在進(jìn)行FM調(diào)制時
%會用到兩個相乘,所以相當(dāng)于一個語音信號的點,要被采樣1000次,并且要求數(shù)據(jù)長度一致
%所以我們可以將語音信號的每一個樣點復(fù)制1000次
%read pcm file
%*********************
%read pcm file
file= fopen('v3edu.pcm','r');
m=fread(file,'int16');
m_len=length(m)*fs/fm;%按照載波采樣率的長度計算
figure(1);
plot(m);title('原始的語音信號');
%*****************************
%generate 1Mhz
w=fc*2^32/fs; %頻率控制字,32位的相位累加器, f_out = fs*w/2^N :
% 載波的ROM
n=0:1/1024:1023/1024;
s_rom=sin(2*pi*n);
c_rom=cos(2*pi*n);
%plot(s_rom);
%接下來產(chǎn)生載波地址,
w_r=0;%相位累加器
rrom_addr=0;%
cw_sin=zeros(1,m_len);%這個相當(dāng)于是我們的查找表,一個周期的正弦波
cw_cos=zeros(1,m_len);
for i=1:m_len
w_r = w_r + w;
if(w_r > 2^32) % 做32位累加器的溢出判斷
w_r= w_r - 2^32;
end
rrom_addr=round(w_r/2^22);%讀查找表的地址
if rrom_addr == 0%matlab計數(shù)時從1開始計數(shù)
rrom_addr =1;
end
cw_sin(i)=s_rom(rrom_addr);%%%%%%載波完成
cw_cos(i)=c_rom(rrom_addr);%載波
end
figure(2);
subplot(2,1,1);plot(cw_sin(1:3000),'r');title('sin載波信號');
subplot(2,1,2);plot(cw_cos(1:3000),'b');title('cos載波信號');
%給音頻數(shù)據(jù)升采樣,與載波長度一致,后面要相乘,所以要保證信號的長度是一樣的
m_t=zeros(1,m_len);
for i=1:length(m)
for j=1:fix(fs/fm)
m_t((i-1)*fix(fs/fm)+j)=m(i);%同一個16k的采樣點復(fù)制1000次這樣就是16M采樣點
end
end
%*************************
%調(diào)制 sin 和cos 的信號
w_r=0;%相位累加器
rrom_addr=0;%
dac_i=zeros(1,m_len);%cos,I路信號
dac_q=zeros(1,m_len);%sin Q路信號
for i=1:m_len
w_r = w_r + kf*m_t(i);
if(w_r > 2^32) % 做32位累加器的溢出判斷
w_r= w_r - 2^32;
elseif(w_r <0)
w_r = w_r + 2^32; % 負(fù)的溢出時
end
rrom_addr=round(w_r/2^22);%讀查找表的地址
if rrom_addr == 0
rrom_addr =1;
end
dac_q(i)=AC*s_rom(rrom_addr);
dac_i(i)=AC*c_rom(rrom_addr);%載波
end
%****************************
%正交調(diào)制
s_t=zeros(1,m_len);
for i=1:m_len
s_t(i) = dac_i(i)*cw_cos(i) + dac_q(i)*cw_sin(i)*(-1);
end
figure(3);
plot(s_t);title('調(diào)制完成信號');
調(diào)制結(jié)束
MATLAB 濾波器的實現(xiàn):
我們實現(xiàn)一個簡單的低通濾波器,只需要將我們我們需要的濾波器參數(shù)輸入Filter Solutions中,然后復(fù)制器抽頭系數(shù),然后與我們的輸入數(shù)據(jù)相卷積就可以了,下面的代碼有注釋.
%%%%%%%%%%%%正交解調(diào)%%%%%%%%%%%%%%%%
i_data = zeros(1,m_len);
q_data = zeros(1,m_len);
for i = 1 : m_len
i_data(i) = s_t(i) * cw_cos(i);
q_data(i) = (-1)* s_t(i) * cw_sin(i);
end
%%%%%%%%%%%%%%進(jìn)行低通濾波%%%%%%%%%%%%%%%%
%濾波器抽抽頭系數(shù),
NUM = [-7.894e-05, -2.483e-04, -4.516e-04, -7.089e-04, -1.035e-03, -1.435e-03, -1.903e-03, -2.417e-03, -2.938e-03, -3.415e-03, -3.778e-03, -3.948e-03, -3.837e-03, -3.357e-03, -2.42e-03, -9.524e-04, 1.106e-03, 3.791e-03, 7.113e-03, 1.105e-02, 1.554e-02, 2.051e-02, 2.583e-02, 3.135e-02, 3.691e-02, 4.233e-02, 4.742e-02, 5.199e-02, 5.588e-02, 5.894e-02, 6.105e-02, 6.213e-02, 6.213e-02, 6.105e-02, 5.894e-02, 5.588e-02, 5.199e-02, 4.742e-02, 4.233e-02, 3.691e-02, 3.135e-02, 2.583e-02, 2.051e-02, 1.554e-02, 1.105e-02, 7.113e-03, 3.791e-03, 1.106e-03, -9.524e-04, -2.42e-03, -3.357e-03, -3.837e-03, -3.948e-03, -3.778e-03, -3.415e-03, -2.938e-03, -2.417e-03, -1.903e-03, -1.435e-03, -1.035e-03, -7.089e-04, -4.516e-04, -2.483e-04, -7.894e-05];
adc_i = conv(i_data,NUM); %低通濾波
adc_q = conv(q_data,NUM);%%%%
%%%%%%%%%%%%%FM解調(diào)%%%%%%%%%%%%%%%%%%%%%%
%重新檢測數(shù)據(jù)長度
c_len = length(adc_i);
cr = zeros(1,c_len);
cj = zeros(1,c_len);
for i = 2: c_len %必須從2開始,因為有I-1
cr(i) = adc_i(i)*adc_i(i) +adc_q(i)*adc_q(i);
cj(i) = adc_i(i-1) * adc_q(i) - adc_i(i)* adc_q(i-1);%I(n-1)*Q(n) -I(n)*Q(n-1)
end
angle = zeros(1,c_len);
for i = 1:c_len
if cr(i) == 0
angle(i) = 0;
else
angle(i) = (cj(i)/cr(i))*2 ^16; %FPGA 中沒有小數(shù),要進(jìn)行量化
end
end
%%%%%%%%%%%%%降采樣%%%%%%%%%%%%%%%%%%%%%%%%%
%降采樣,以均值方式,16M,降到16k
d_len = length(angle);
sum = 0;
cnt = 0;
demout = zeros(1,fix(d_len*(fm/fs)));
d_cnt = 1;
for i= 1:d_len
sum = sum + angle(i);
if cnt == fs/fm %完成1000次的累加
demout(d_cnt) = sum /cnt;
d_cnt = d_cnt + 1;
cnt = 0;
sum= 0;
end
cnt = cnt + 1;
end
figure(4);
plot(demout);title('解調(diào)后的信號');
最后結(jié)果圖:
-
調(diào)制解調(diào)
+關(guān)注
關(guān)注
0文章
76瀏覽量
21852 -
matlab
+關(guān)注
關(guān)注
188文章
2998瀏覽量
233263 -
FM調(diào)制
+關(guān)注
關(guān)注
0文章
7瀏覽量
6799
原文標(biāo)題:FM調(diào)制解調(diào)以及MATLAB實現(xiàn)
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
FM信號的解調(diào)電路--斜率鑒頻器

QPSK信號的調(diào)制解調(diào)及其誤碼率的仿真
如何在multisim中仿真實現(xiàn)FM-GFSK和PM-D8PSK調(diào)制解調(diào)的電路。
請問ad9361在MATLAB中解調(diào)FM廣播信號需要對收到的基帶信號做哪些處理
Multisim調(diào)制解調(diào)電路仿真
ab代碼實現(xiàn)例子-DPSK信號的調(diào)制解調(diào)Matlab代碼(采
基于MATLAB的simulink仿真2Fsk調(diào)制解調(diào)
FM調(diào)制/解調(diào)電路的設(shè)計方案分析

基于matlab的msk調(diào)制解調(diào)的實現(xiàn)

gmsk調(diào)制解調(diào)matlab如何實現(xiàn)_兩種gmsk調(diào)制解調(diào)方式的實現(xiàn)

如何使用Matlab和Simulink進(jìn)行調(diào)制解調(diào)的分析

如何使用軟件無線電實現(xiàn)QDPSK調(diào)制解調(diào)算法的硬件

評論