FM调制解调

news/2025/2/13 23:24:14/

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;                     % 调频系数  频偏75kHzintegral_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:16if B_s(j)=='1'tb=1;elsetb=0;endfprintf(fid,'%d',tb);  endfprintf(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:16if B_s(j)=='1'tb=1;elsetb=0;endfprintf(fid,'%d',tb);  endfprintf(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 ) beginif(rst)  begin    //清零Im<=0;Qm<=0;endelse beginIm<=im;         //延时一个单位Qm<=qm;         //qm(n)=Qm(n-1)Sn <= Qm * im - qm * Im ; //解调信号       endend
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个数据beginPattern=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('解调信号频域');

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


http://www.ppmy.cn/news/804412.html

相关文章

北京地区能收到的FM广播电台频率表(基于手机)

说明 所参考的原文网址为http://bbs.dospy.com/viewthread.php?tid2082608&pid77232170&page1&extrapage%3D1#pid77232170 2009.11.25 使用诺基亚N81手机的自带收音机&#xff0c;在北京西四环中部室外露天测试。除河北的电台&#xff0c;原文所有电台信号良好。…

一个状态栏的黑科技

https://blog.csdn.net/guolin_blog/article/details/123023395

抖音直播间截流黑科技

众所周知现在商业化的直播间设置了匿名加密&#xff0c;直播间粉丝数据无法查看&#xff0c;是为了防止被同行截留客户&#xff0c;但是在这套技术面前&#xff0c;这种设置都是小儿科

黑科技是什么

黑科技是网络新词&#xff0c;指远超越现今人类科技或知识所能及的范畴&#xff0c;缺乏科学根据并且违反自然原理的科学技术或者产品。 黑科技是在《全金属狂潮》中登场的术语&#xff0c;原意指非人类自力研发&#xff0c;凌驾于人类现有的科技之上的知识&#xff0c;引申为以…

html黑科技导入res,css黑科技

当我们面对一些需求的时候可能会问自己能不能只使用 css 完成它&#xff0c;而不用 javascript。最新的 css 属性跟功能能够简单快速的解决很多老问题。 本文总结了 50 多个很有趣的的 css 属性和值&#xff0c;我会简单的介绍他们的用法并提供示例。其中有一些属性目前是试验属…

黑科技知识

前言 这里记录&总结一些平常 O I OI OI 竞赛(我还没有AFO的时候)中并不是很常用的毒瘤玩意。 黑科技 黑科技数据结构 1. 李超线段树 一种线段树维护某一类信息的方法。 支持区间加入一次函数,询问区间的一次函数最值。 修改复杂度为 O ( l o g 2 n ) O(log^2n) O(…

黑科技小工具-uTools

好久没有介绍啥提升工作效率的工具了&#xff0c;主要是没有遇到好的了&#xff0c;uTools这个小工具通过各种插件可以提升我们的工作效率&#xff0c;试用了下&#xff0c;还不错。 一 uTools是什么&#xff1f; uTools 非常类似我以前推荐过的Listary&#xff0c;就是一个框框…

黑科技合集

编辑页面文字 在浏览页面的时候想要复制一段文字&#xff0c;却发现文字不能被编辑&#xff1f;其实方法很简单&#xff0c;按F12快键打开控制台&#xff0c;在控制台里面输入 javascript:document.body.contentEditabletrue;document.designModeon; void(0); 你就会发现页面…