概述
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:FMMATLABQm.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,'rn');
end
fprintf(fid,';');
fclose(fid);
fid=fopen('E:FMMATLABIm.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,'rn');
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
//文件必须放置在"工程目录simulationmodelsim"路径下
$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
//文件放置在"工程目录simulationmodelsim"路径下
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:FMquartussimulationmodelsimSn.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('解调信号频域');
低通滤波前的解调信号如图:
从频谱图可以看出信号的高频噪声很多,信噪比低。
再加上低通滤波器后的解调信号如图:
通过低通滤波器以后,高频噪声被去除,信噪比变高。此时与原信号的波形图和频谱图基本一致。
最后
以上就是俊逸盼望为你收集整理的FM调制解调的全部内容,希望文章能够帮你解决FM调制解调所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复