FM调制解调

AI助手已提取文章相关产品:

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('解调信号频域');

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

您可能感兴趣的与本文相关内容

### FM调制解调原理及实现方法 FM(Frequency Modulation,频率调制)是一种通过改变载波信号的频率来传递信息的调制方式。其基本原理是将调制信号的信息映射到载波信号的频率变化上[^3]。在通信系统中,FM调制因其较高的抗噪声性能和较好的信号质量而被广泛应用。 #### 1. FM调制原理 FM调制的核心思想是使载波的瞬时频率随调制信号的变化而变化。假设调制信号为 \( m(t) \),载波信号为 \( c(t) = A_c \cos(2\pi f_c t) \),其中 \( f_c \) 是载波频率,\( A_c \) 是载波振幅。经过FM调制后,已调制信号可以表示为: \[ s_{FM}(t) = A_c \cos\left(2\pi f_c t + 2\pi k_f \int_0^t m(\tau) d\tau \right) \] 其中: - \( k_f \) 是频偏常数,决定了调制信号对载波频率的影响程度。 - \( \int_0^t m(\tau) d\tau \) 表示调制信号的时间积分,反映了调制信号的累积效应。 在MATLAB中,可以直接使用 `fmmod` 函数实现FM调制。例如: ```matlab y = fmmod(m_t, fc, fs, kf); ``` 这里,`m_t` 是调制信号,`fc` 是载波频率,`fs` 是采样频率,`kf` 是频偏常数[^1]。 #### 2. FM解调原理 FM解调的目标是从已调制信号中提取出原始的调制信号。理想情况下,解调过程应该能够恢复调制信号的频谱而不引入额外的失真或噪声。常用的FM解调方法包括鉴频器法、相位差法等。在MATLAB中,可以通过 `demod` 函数实现FM解调: ```matlab so = demod(y, fc, fs, 'fm'); ``` 解调后的信号需要进一步处理,例如降采样率以匹配播放设备的要求[^1]。 #### 3. 实现步骤 以下是一个完整的MATLAB代码示例,展示如何实现FM调制解调: ```matlab % 参数设置 fc = 10000; % 载波频率 (Hz) fs = 44100; % 采样频率 (Hz) kf = 10; % 频偏常数 t = 0:1/fs:1; % 时间向量 (1秒) % 调制信号 m_t = sin(2*pi*100*t); % 假设调制信号为100Hz正弦波 % FM调制 y = fmmod(m_t, fc, fs, kf); % FM解调 so = demod(y, fc, fs, 'fm'); % 降采样率处理 data_out = resample(so, 1, 40); % 播放解调后的信号 sound(data_out, fs); % 绘图 figure; subplot(2,1,1); plot(y, 'b'); title('FM信号'); xlabel('时间'); ylabel('幅度'); subplot(2,1,2); plot(so, 'r'); title('FM解调信号'); xlabel('时间'); ylabel('幅度'); ``` #### 4. 频谱分析 FM调制后的信号频谱会发生显著变化。载波信号的单一频率成分会分裂成以载波频率为中心的两个边带。每个边带的带宽取决于调制信号的频率和调制指数 \( \beta \),定义为: \[ \beta = \Delta f / f_m \] 其中,\( \Delta f \) 是最大频偏,\( f_m \) 是调制信号的最高频率。 解调后,信号的频谱应恢复到原始调制信号的频谱。这要求解调器具有足够的线性度和稳定性,以避免引入失真。 --- ###
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值