FM调制解调

FM调制解调
1.matlab仿真
先用matlab仿真,验证算法的可行性。
代码如下:

echo off
close all
clear all
clc

%%%%%%%%%%%%%%%%%%FM调制%%%%%%%%%%%%%%%%%%%%%
ps = 625000;                    % 数据率625KHz
Fs = 80*10^6;                   % 80M采样率
dt = 1/Fs;                      % 采样间隔
a  = 1000;                      
t  = 0:dt:(a*Fs/ps-1)/Fs;       % 产生时间序列
N  = length(t)-1;
am = 5;                         % 设定调制信号幅度
fm = 15*10^2;                   % 调制信号频率
fc = 5*10^6;                    % 载波频率5M
mt = am*sin(2*pi*fm*t);         % 生成调制信号
ct = cos(2*pi*fc*t);            % 生成载波
kf = 10000;                     % 调频系数  频偏75kHz

integral_mt(1)=0;
for i=1:N                       %积分
    integral_mt(i+1)=integral_mt(i)+mt(i)*dt;
end
%figure(100);plot(t,integral_mt); title('integral_mt');
sfm= am*cos(2*pi*fc*t+2*pi*kf*integral_mt); %已调信号

%%%%%%%%%%%%画图%%%%%%%%%%%%
figure(1);
subplot(311);
plot(t,mt); title('调制信号时域');
axis([0 10^(-3) -5 5]);  
subplot(312);plot(t,ct); title('载波信号时域');
axis([0 10^(-5) -1 2]);  
subplot(313);plot(t,sfm);title('已调信号时域');
axis([0 10^(-5) -5 5]);  

%%%%%%%%%%%%画图%%%%%%%%%%%%
figure(2);
subplot(311);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(mt)))));
title('调制信号频域'); 
subplot(312);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(ct)))));
title('载波信号频谱'); 
subplot(313);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(sfm)))));
title('已调信号频域');

%%%%%%%%%%%%%%%%%%生成IQ信号%%%%%%%%%%%%%%%%%%%%%
st=imag(hilbert(ct));  %提取载波的正交分量 sin(wc*t)
ct=real(hilbert(ct));  %cos(wc*t)
for i=1:length(sfm)
Ih(i)=sfm(i)*ct(i);
Qh(i)=sfm(i)*st(i);
end

%%%%%%%%%%%%%%%%%%%%%滤波降频%%%%%%%%%%%%%%%%%%%
Flp=fc;
b=fir1(200,Flp/Fs,'low'); %设计滤波器
% figure(4);  
% stem(b);                %滤波器单位脉冲响应
Qm=filter(b,1,Qh); 
Im=filter(b,1,Ih);
% figure(6)
% subplot(211);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Qm))));
title('Q信号波形频域'); 
% subplot(212);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Im))));
title('I信号波形频域'); 
% figure(5)
% subplot(211);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Qh))));
title('Qh信号波形频域'); 
% subplot(212);
plot((N/2:N/2)*Fs/N,abs(fftshift(fft(Ih))));
title('Ih信号波形频域'); 
% figure(8)
% subplot(211);plot(t,Qm);title('Q信号波形'); 
% subplot(212);plot(t,Im);title('I信号波形'); 
% figure(7)
% subplot(211);plot(t,Qh);title('Qh信号波形'); 
% subplot(212);plot(t,Ih);title('Ih信号波形');

%%%%%%%%%%%%%进行16bit量化%%%%%%%%%%%%%%%%%
Qm16=round(Qm/max(abs(Qm))*(2^15-1));
Im16=round(Im/max(abs(Im))*(2^15-1));
%求系数绝对值之和,以此估计滤波后的有效数据位宽
sum_Shape=sum(abs(Qm16));

%%%%%%%%%%%%%%%%%%%解调%%%%%%%%%%%%%%%%%%%
Sn(1)=0;
for i=2:length(Qm)  
Sn(i) =-(Qm16(i)*Im16(i-1)-Qm16(i-1)*Im16(i));
end
Sn=Sn/max(abs(Sn));

%%%%%%%%%%对解调信号进行滤波消除噪声%%%%%%%%%
Flp1=2*10^5;
a=fir1(200,Flp1/Fs,'low'); %设计滤波器
% figure(4);  
% stem(b);  %滤波器单位脉冲响应
Sn=filter(a,1,Sn); 
%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%
figure(11);
subplot(411);
plot(t,Sn);title('解调信号波形'); 
%axis([0 2*10^(-3) -1 1 ]);  
subplot(412);plot(t,mt);
title('原始信号波形'); 
%axis([0 2*10^(-3) -5 5 ]);  
subplot(413);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(Sn)))));
title('解调信号频域'); 
%axis([-10000 10000 0 50000]);  
subplot(414);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(mt)))));
title('原始信号频域'); 
%axis([-10000 10000 0 500000]); 
%%%%%%%%%将有符号十进制转化为二进制%%%%%%%%%%%%%

fid=fopen('E:\FM\MATLAB\Qm.txt','w');
for k=1:length(Qm16)
    B_s=dec2bin(Qm16(k)+(Qm16(k)<0)*2^16,16);
    for j=1:16
       if B_s(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end
    fprintf(fid,'\r\n');
end
fprintf(fid,';'); 
fclose(fid);

fid=fopen('E:\FM\MATLAB\Im.txt','w');
for k=1:length(Im16)
    B_s=dec2bin(Im16(k)+(Im16(k)<0)*2^16,16);
    for j=1:16
       if B_s(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end
    fprintf(fid,'\r\n');
end
fprintf(fid,';'); 
fclose(fid);

运行结果如下:

这里写图片描述
这里写图片描述
通过时域波形和频谱图对比可以看出,解调信号与原信号相差不大。解调算法可行。
2.modelsim仿真
将MATLAB仿真出来的已经降频的I、Q两路信号导入文本文件中,作为modelsim仿真的输入信号。
quartus新建工程,解调部分Verilog代码:

module demod (
  rst,
  clk,
  Sn,
  im,
  qm
  );
 input rst , clk;
 input signed [15:0]im,qm;
 reg signed[15:0]Im,Qm;
 output [15:0]Sn;
 reg signed[32:0] Sn;

 always @ (posedge clk ) begin
   if(rst)  begin    //清零
     Im<=0;
     Qm<=0;
    end
    else begin
     Im<=im;         //延时一个单位
     Qm<=qm;         //qm(n)=Qm(n-1)
     Sn <= Qm * im - qm * Im ; //解调信号       
    end
 end
endmodule

textbench部分代码(省略端口连接等部分代码):

initial                                                
begin 
 clk=0;
//设置复位信号
 rst=1;                                                 
 #2 rst =0 ;          
end                                                    
always                                                               
begin                                                  
#2 clk=~clk;                                                         
end                                                    
//从外部TX文件读入数据作为测试激励
integer Pattern;
reg signed [15:0] stimulusQ[1:data_num];
reg signed [15:0] stimulusI[1:data_num];
initial
begin
   //文件必须放置在"工程目录\simulation\modelsim"路径下
    $readmemb("Qm.txt",stimulusQ );
    $readmemb("Im.txt",stimulusI );//读入2进制数据
    Pattern=0;
    repeat(data_num)    //读入128000个数据
        begin
            Pattern=Pattern+1;
            qm=stimulusQ[Pattern-1];
            im=stimulusI[Pattern-1];
            #4;         
        end
        $stop ;           //停止读取数据 
end
//将解调信号数据Sn写入外部TXT文件中(Sn.txt)
integer file_Sn;
initial
begin
   //文件放置在"工程目录\simulation\modelsim"路径下                                                  
    file_Sn = $fopen("Sn.txt");
end
always @(posedge clk)
$fdisplay(file_Sn,"%d",Sn);
endmodule

modelsim仿真波形:
这里写图片描述
matlab读取modelsim仿真的解调信号数据并分析:

clear all
clc
ps = 625000;                    %数据率625KHz
a  = 1000;                      %数据长度
Fs = 80*10^6;                     %采样率
dt = 1/Fs;                        
t  = 0:dt:(a*Fs/ps-1)/Fs;    

%%%%%%%%%读取modelsim仿真的解调信号数据%%%%%%%%%%  
fid=fopen('E:\FM\quartus\simulation\modelsim\Sn.txt','r');
[s,N]=fscanf(fid,'%lg',inf);
N=N-1;
fclose(fid);
sn=s/max(abs(s));
%%%%%%%%%%%%%%%%%%低通滤波%%%%%%%%%%%%%%%%%%%%
% Flp1=2*10^5; %滤波器截止频率
% a=fir1(200,Flp1/Fs,'low'); %设计滤波器
% figure(4);  
% stem(b);  %滤波器单位脉冲响应
% sn=filter(a,1,sn); 

%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%
figure(1);
subplot(211);plot(t,sn);title('解调信号时域'); 
subplot(212);
plot((N/2:N/2)*Fs/N,20*log10(abs(fftshift(fft(sn)))));
title('解调信号频域');

低通滤波前的解调信号如图:
这里写图片描述
从频谱图可以看出信号的高频噪声很多,信噪比低。
再加上低通滤波器后的解调信号如图:
这里写图片描述
通过低通滤波器以后,高频噪声被去除,信噪比变高。此时与原信号的波形图和频谱图基本一致。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页