1.FM的模拟调制过程

​ FM信号是一种频率调制信号,其携带的信息保存在其信号的频率中,通过改变载波的频率来实现基带数据的传输。

其函数表达式如下:

\[s(t) = A*cos(w_c*t + K_f*\int m(\tau) d\tau)
\]

其中:

\(A\):表示载波幅度。

\(m(\tau)\):表示基带信号。

\(w_c\):表示载波信号角度增量。

\(K_f`\):是调频灵敏度。

正交调制法公式如下:

\[I(t) = cos(K_f*\int m(\tau) d\tau) \\
Q(t) = sin(K_f*\int m(\tau) d\tau) \\
s(t) = A*(I(t)*cos(w_c*t) - Q(t)*sin(w_c*t))
\]

2.FM的数字正交解调

原理:

对于I路,其中\(\varphi\)表示调制载波与解调载波的相位差:

\[\begin{array}{flalign}
I(n) & = LPF(s(n)*cos(w_c*n + \varphi)) \\
& = \frac{cos(K_f*\sum m(n))*cos(\varphi) + sin(K_f*\sum m(n))*sin(\varphi)}{2} \\
& = \frac{1}{2}*cos(K_f*\sum m(n) - \varphi)
\end{array}
\]

对于Q路:

\[\begin{array}{flalign}
Q(n) & = LPF(s(n)*sin(w_c*n + \varphi)) \\
& = \frac{cos(K_f*\sum m(n))*sin(\varphi) - sin(K_f*\sum m(n))*cos(\varphi)}{2} \\
& = \frac{1}{2}*sin(K_f*\sum m(n) - \varphi)
\end{array}
\]

同时:

\[\begin{array}{flalign}
&\ \frac{Q(n)}{I(n)} = \frac{sin(K_f*\sum m(n)- \varphi)}{cos(K_f*\sum m(n)- \varphi)} = tan(K_f*\sum m(n) - \varphi) \\
&\ SUM(n) = arctan(\frac{Q(n)}{I(n)}) = K_f*\sum m(n) - \varphi\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
(\frac{Q(n)}{I(n)}) \in (-\pi/2\space\space\space\space\pi/2) \\
&\ M(n) = SUM(n) - SUM(n-1) = K_f* m(n) \\
\end{array}
\]

注:上式推算中使用了arctan函数,其中arctan的输入范围\((-\pi/2\space\space\space\space\pi/2)\)。当范围超过将计算错误。所以将使用MATLAB的atan2函数进行计算。

\[\begin{array}{equation}
SUM(n) = atan2(Q(n),I(n)) = K_f*\sum m(n) - \varphi \\
M(n) = SUM(n) - SUM(n-1) = K_f* m(n)
\end{array}
\]

3.MATLAB仿真

仿真代码:

fs = 20000;%采样率
l = 1E3;%基带信号点数
f = 100;%基带信号
f_c = 2000;%载波信号
t = 0:1/fs:(l-1)/fs;
mt = cos(2*pi*f*t);
kf = fs * 0.4;
%% IQ信号
I = cos(kf*cumtrapz(t,mt));
Q = sin(kf*cumtrapz(t,mt));
%% 调制数据
mod_data = I.*cos(2*pi*f_c*t) - Q.*sin(2*pi*f_c*t);
%% 解调
mmm = atan2(Q,I);
demod = zeros(1,length(mmm));
for i = 2:1:length(demod)
demod(i) = mmm(i) - mmm(i-1);
if(demod(i) >= pi)
demod(i) = demod(i) - pi*2;
elseif(demod(i) <= -pi)
demod(i) = demod(i) + pi*2;
else
demod(i) = demod(i);
end
end %% 保存IQ数据FPGA使用仿真
fid = fopen('FM.txt','w');
for i = 1:l
fprintf(fid,'%d %d\n',floor(I(i)* (2^13)),floor(Q(i)* (2^13)));
end
fclose(fid); %% 绘制
figure
time = 3;
subplot(time,1,1);
plot(mt);
title('基带数据'); subplot(time,1,2);
plot(mod_data);
title('调制数据'); subplot(time,1,3);
plot(demod);
title('解调数据');

结果:

4.FPGA解调

逻辑代码:

module fm_demod(
input clk ,
input rst ,
//解调参数
input i_valid ,
input [15:0] i_data_i ,
input [15:0] i_data_q ,
output reg o_rdy ,
output reg [15:0] o_data ); wire fm_valid ;
wire [23:0] fm_i ;
wire [23:0] fm_q ; wire fm_rdy ;
wire [47 : 0] m_axis_dout_tdata ;
wire [15:0] fm_phase ;
//AM 解调 assign fm_valid = i_valid ;
assign fm_i = {{8{i_data_i[15]}},i_data_i} ;
assign fm_q = {{8{i_data_q[15]}},i_data_q} ; cordic_translate cordic_translate (
.aclk (clk ), // input wire aclk
.s_axis_cartesian_tvalid (fm_valid ), // input wire s_axis_cartesian_tvalid
.s_axis_cartesian_tdata ({fm_i,fm_q} ), // input wire [47 : 0] s_axis_cartesian_tdata
.m_axis_dout_tvalid (fm_rdy ), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata (m_axis_dout_tdata ) // output wire [47 : 0] m_axis_dout_tdata
); reg [15:0] fm_phase_d; assign fm_phase = m_axis_dout_tdata[24 +:16];
always @(posedge clk)begin
if(rst)begin
o_rdy <= 0;
o_data <= 0;
o_data <= 0;
end
else begin
o_rdy <= fm_rdy;
fm_phase_d <= fm_phase[15:0];
o_data <= fm_phase[15:0] - fm_phase_d;
end
end endmodule

仿真代码:


module tb_fm_demod();
reg clk;
reg rst; initial begin
clk <= 0;
rst <= 1;
#300
rst <= 0;
end always #(100/2) clk <=~clk; reg valid;
reg [15:0] din_i;
reg [15:0] din_q;
wire o_rdy ;
wire [15:0] o_data ; fm_demod fm_demod(
.clk (clk),
.rst (rst),
.i_valid (valid),
.i_data_i (din_i),
.i_data_q (din_q),
.o_rdy (o_rdy ),
.o_data (o_data ) ); integer file_rd; //定义数据读指针
integer flag;
initial begin //打开读取和写入的文件,这里的路径要对
file_rd = $fopen("FM.txt","r");
end reg [15:0] cnt; always @(posedge clk)begin
if(rst)begin
din_i <= 0;
din_q <= 0;
cnt <= 0;
valid <= 0;
end
else if(cnt <= 1000)begin
valid <= 1;
flag = $fscanf(file_rd,"%d %d",din_i,din_q);
cnt <= cnt + 1;
end
else begin
$fclose(file_rd);
$stop();
end
end
endmodule

仿真结果:

FM的正交解调法的更多相关文章

  1. Python实现正交实验法自动设计测试用例

    1.简介 正交试验法是研究多因素.多水平的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的.有代表性的点进行试验,这些有代表性的点具备了 ...

  2. 正交实验法之 Allpairs电商项目用例设计实战

    一.正交实验法概述 正交实验法是研究多因素多水平的一种方法,它是通过正交表挑选部分有代表性的水平组合试验替代全面试验.这些有代表性的组合试验具备了"均匀分散,整齐可比"的特点.正交 ...

  3. AGC电路以及AD8347正交解调芯片

    1.AGC电路的工作原理 1.1AGC电路的用途 随着电磁环境的日益恶化, 不同频段电磁信号之间的相互串扰, 以及可能出现的人为干扰, 将会导致接收机输入端口的信号动态范围较大, 一旦出现电路饱和或是 ...

  4. matalb 产生信号源 AM调制解调 FM调制解调

    %%%%%%%%%%%%%%%%%%%%%%%%%%% %AM调制解调系统 %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clf; close all Fs=800000;%采 ...

  5. 浅谈压缩感知(九):正交匹配追踪算法OMP

    主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/article/details/7467955 ...

  6. 方差分析3——正交表与正交实验设计(R语言)

    正交试验设计(orthogonal design简称正交设计(orthoplan),是利用正交表(orthogonal table)科学地安排与分析多因素试验的方法,是最常用的试验设计之一.正交表是一 ...

  7. gardner 算法matlab实现

    % 仿真4比特原始数据与星座图的编码映射过程: % 完成16QAM信号的调制解调: % 基带信号符号速率 ps =1Mbps: % 成形滤波器的滚降因子 a=0.8: % 载波信号频率fc=2MHz ...

  8. NCO

    NCO 摘自百度百科 (数字振荡器) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 数字控制振荡器(NCO,numerically controlled oscillator)是 ...

  9. PCA主成分分析 R语言

    1. PCA优缺点 利用PCA达到降维目的,避免高维灾难. PCA把所有样本当作一个整体处理,忽略了类别属性,所以其丢掉的某些属性可能正好包含了重要的分类信息 2. PCA原理 条件1:给定一个m*n ...

  10. R语言实战(九)主成分和因子分析

    本文对应<R语言实战>第14章:主成分和因子分析 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量成为主成分. 探索性因子分析(EFA)是 ...

随机推荐

  1. foobar2000 v2.1.3 汉化版(更新日期:2024.04.02)

    foobar2000 v2.1.3 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...

  2. thinkphp中的or,like,in等联合查询

    数据库中的两个字段有一个字段等于查询条件时,下面两个方法都是可以的: (1) $where['a.goods_name|a.goods_sn'] = array('like',"%$keyW ...

  3. 19 Transformer 解码器的两个为什么(为什么做掩码、为什么用编码器-解码器注意力)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  4. kotlin类与对象——>对象表达式与对象声明、内联类

    1.对象表达式与对象声明 有时候,我们需要创建一个对某个类做了轻微改动的类的对象,而不用为之显式声明新的子类.Kotlin 用对象表达式和对象声明处理这种情况 2.对象表达式 要创建一个继承自某个(或 ...

  5. Oracle中查看隐含参数的sql

    select a.ksppinm "Parameter", a.ksppdesc "Description", b.ksppstvl "Session ...

  6. 妙用编辑器:使用Notepad--列编辑功能批量生成维护命令

    应用场景 在日常工作中,维护人员可能会要批量生成一些配置命令,示例如下:添加12个分组 ADD GROUP:GID=1,FCN=646322; ADD GROUP:GID=1,FCN=646322; ...

  7. 云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1

    开源项目 Kubetools Recommender System Kubetools Recommender System (Krs) 是一个基于 GenAI 的工具,用于帮助管理和优化 Kuber ...

  8. 函数计算平台 OpenFunction 在自动驾驶领域的应用

    嘉宾 | 霍秉杰 整理 | 王新 出品 | CSDN 云原生 2022 年 5 月 10 日,在 CSDN 云原生系列在线峰会第 4 期"ApacheSkyWalking 峰会"上 ...

  9. SpringBoot入门到精通(十三)日志:别小看它,否则吃亏的是自己!学会你也可以设计架构

    别小看他,当你面对的时候,就会知道,多么痛的领悟! 如何在 Spring Boot 中使用 Logback 记录详细的日志? 整合LogBack,Log4J...等,是不是很多方法!但需要注意,我讲的 ...

  10. uniapp、nativeJS、H5+退出APP应用(IOS+安卓)

    uniapp.nativeJS.H5+退出APP应用(IOS+安卓)阅读原文:https://mp.weixin.qq.com/s/Aru-DCcSHrNcuxJ6Q94QLQ直接扫码进入此链接可阅读 ...