笔记-AM的正交解调法
1.AM的模拟调制过程
AM信号是一种振幅调制信号,其携带的信息保存在其信号的振幅中,通过改变载波的振幅来实现基带数据的传输。
其函数表达式如下:
\]
其中:
A
:表示基带信号加载的直流分量。
m(t)
:表示基带信号。
\(cos(2\pi ft + \varphi )\):表示载波信号。

正交调制法公式如下:
Q(t) = (A + m(t))*sin(\varphi) \\
s(t) = I(t)*cos(2\pi ft) + Q(t)*sin(2\pi ft)
\]
2.AM的数字解调
AM解调的方法有很多种,以下只简单介绍两种,分别为非相干解调(包络面解调法)和相干解调(正交解调法)。一般的相干解调法要求产生一个与调制载波严格等频等相的载波用于信号的解调,抗载频失配能力较差,毕竟出现频差或者相差就会对解调出来的信号产生较大的误差。
以下介绍的正交解调法将消除频差或者相差带来的误差,增加其解码正确率。

通过正交的方式即可解调出基带信号,其数学推导如下:
假设基带信号频率为f1,调制的载波频率为f2,直流信号为A,解调的载波频率为f3,则:
I路:
\]
根据三角函数公式:
I(t) &= \frac{1}{2}A[cos(2\pi (f_2 + f_3)t+\varphi) + cos(2\pi (f_2 - f_3)t+\varphi)] \\
&+ \frac{1}{4}[cos(2\pi (f_1 + f_2 + f_3)t+\varphi) + cos(2\pi (f_1 - f_2 - f_3)t+\varphi)] \\
&+ \frac{1}{4}[cos(2\pi (f_1 + f_2 - f_3)t+\varphi) + cos(2\pi (f_1 - f_2 + f_3)t+\varphi)]
\end{split}
\]
经过低通滤波器,不考虑滤波器增益:
\]
设解调的载波与调制的载波的频率偏移为f4:
\]
则:
\]
同理可求得Q:
\]
还原信号:
\]
这样就消除了相位差带来的误差,同时这个有个前提:$$A + m(t)$$必须大于0,不过经过AM调制,一定是大于0的。否则将出现失真。
由上式可以推断出解调的载波与调制的载波的频率偏移频率,只要位于设计的滤波器的带宽内,就可以解调出原始信号,与偏移量的大小无关。只要保证在获取I路信号和Q路信号的滤波器能正确将高频信号滤除,通过IQ求模,就可以成功将频差相位差两个变量消除。
3.去直流
解调出来的信号中包含了一个直流信号A,在频谱分析中我们一般将直流信号当作频率为0的正弦信号,那么这样我们就可以通过滤波器的方式对直流进行处理。
1.均值滤波器
将直流信号分量计算出来,将原信号减去直流信号就可以获取到基带信号。
\]
均值滤波器表达式:
\]
matlab:
close all;
N1 = 64;
N2 = 128;
N3 = 256;
a = ones(N1,1)/N1;
b = ones(N2,1)/N2;
c = ones(N3,1)/N3;
figure('menubar','figure');
[h1, w1] = freqz(a,1,2048,1000);
[h2, w2] = freqz(b,1,2048,1000);
[h3, w3] = freqz(c,1,2048,1000);
plot(w1, abs(h1),'DisplayName',num2str(N1));
hold on
plot(w2, abs(h2),'DisplayName',num2str(N2));
hold on
plot(w3, abs(h3),'DisplayName',num2str(N3));
title('Amplitude Response');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
legend('show');

可以看出均值滤波器实际上是一种特殊大的均值滤波器,随着N的变大,其截至频率变小。所以可以根据需求选择适当的截至频率,从而滤除除直流外的其余频率分量,从而分离出直流信号。
2.高通滤波器
均值滤波器采用分离出直流的方法来算出基带信号,高通滤波器则采样滤除直流信号,保留基带信号的方式来处理数据。可以通过matlab的工具filterDesigner来设计一个满足需求的高通滤波器。涉及要求,基带信号频率大于通带频率。且越靠近0频效果越好。

4.MATLAB解调
fs = 10E6;%采样率
A = 1;%直流大小
l = 1E3;%基带信号点数
f = 0.1E6;%基带信号
f_c = 2E6;%载波信号
t = 0:1/fs:(l-1)/fs;
fi = pi/3;%IQ相位
mt = cos(2*pi*f*t);%基带数据
%% IQ基带数据调制
I = (A + mt) * cos(fi);
Q = (A + mt) * sin(fi);
mod_data = I.* cos(2*pi*f_c*t) + Q.* sin(2*pi*f_c*t);
%% 基带数据解调
demod = sqrt(I.^2 + Q.^2)/2;
%% 去直流
dc_signal = sum(demod)/l;
demod0 = demod-dc_signal;
%% 保存IQ数据FPGA使用仿真
fid = fopen('AM.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 = 4;
subplot(time,1,1);
plot(mt);
title('基带数据');
subplot(time,1,2);
plot(mod_data);
title('调制数据');
subplot(time,1,3);
plot(demod);
title('解调数据');
subplot(time,1,4);
plot(demod0);
title('解调数据(去直流)');
结果:

5.FPGA解调
逻辑代码:
module am_demod(
input clk ,
input rst ,
//解调参数
input i_valid ,
input [15:0] i_data_i ,
input [15:0] i_data_q ,
output o_rdy ,
output [15:0] o_data
)
wire am_valid ;
wire [23:0] am_i ;
wire [23:0] am_q ;
wire am_rdy ;
wire [47 : 0] m_axis_dout_tdata ;
//AM 解调
assign am_valid = i_valid ;
assign am_i = {{8{i_data_i[15]}},i_data_i} ;
assign am_q = {{8{i_data_q[15]}},i_data_q} ;
cordic_translate cordic_translate (
.aclk (clk ), // input wire aclk
.s_axis_cartesian_tvalid (am_valid ), // input wire s_axis_cartesian_tvalid
.s_axis_cartesian_tdata ({am_i,am_q} ), // input wire [47 : 0] s_axis_cartesian_tdata
.m_axis_dout_tvalid (am_rdy ), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata (m_axis_dout_tdata ) // output wire [47 : 0] m_axis_dout_tdata
);
assign o_rdy = am_rdy ;
assign o_data = m_axis_dout_tdata[15:0] ;
endmodule
仿真代码:
module tb_am_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 ;
am_demod am_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("AM.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
仿真结果:

笔记-AM的正交解调法的更多相关文章
- Python实现正交实验法自动设计测试用例
1.简介 正交试验法是研究多因素.多水平的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的.有代表性的点进行试验,这些有代表性的点具备了 ...
- 正交实验法之 Allpairs电商项目用例设计实战
一.正交实验法概述 正交实验法是研究多因素多水平的一种方法,它是通过正交表挑选部分有代表性的水平组合试验替代全面试验.这些有代表性的组合试验具备了"均匀分散,整齐可比"的特点.正交 ...
- AGC电路以及AD8347正交解调芯片
1.AGC电路的工作原理 1.1AGC电路的用途 随着电磁环境的日益恶化, 不同频段电磁信号之间的相互串扰, 以及可能出现的人为干扰, 将会导致接收机输入端口的信号动态范围较大, 一旦出现电路饱和或是 ...
- 【算法笔记】B1024 科学计数法
1024 科学计数法 (20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位, ...
- OpenCV2.x自学笔记——最大类间方差法OTSU
推荐用法:(参数勿动) threshold(gray,binary,0,255,CV_THRESH_OTSU+CV_THRESH_BINARY);
- 目标跟踪之Lukas-Kanade光流法
转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...
- 浅谈压缩感知(九):正交匹配追踪算法OMP
主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/article/details/7467955 ...
- 目标跟踪之Lukas-Kanade光流法(转)
光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...
- 事件分析法学习笔记(ESM)
事件分析法基础学习笔记 1.定义 事件分析法是研究某事件的发生对组织价值的影响以及影响程度. 或者说研究特定事件对组织行为的影响. notes:事件分析法的关键点在于探讨所关注事件在某个时段产生的 ...
- 方差分析3——正交表与正交实验设计(R语言)
正交试验设计(orthogonal design简称正交设计(orthoplan),是利用正交表(orthogonal table)科学地安排与分析多因素试验的方法,是最常用的试验设计之一.正交表是一 ...
随机推荐
- argmax经过sigmoid和不经过sigmoid区别
起因 今天和同组讨论了一下网络输出时,在torch.argmax之前经过torch.sigmoid和不经过sigmoid的区别. 主要起因是实验结果图像不同 图1 不经过sigmoid 图2 经过si ...
- 虚拟dom的优缺点
虚拟dom 是js模拟的一颗dom树,也是 js 对象 : 虚拟dom 时相对于 真实dom而言的,操作真实 dom 开销太大,降低了性能,所以使用 虚拟 dom 替代真实 dom 完成操作和计算功能 ...
- 0404-Tensor的持久化和向量化
0404-Tensor的持久化和向量化作 目录 一.持久化 1.1 保存模型 1.2 加载模型 二.向量化 三.注意事项 四.第四章总结 pytorch完整教程目录:https://www.cnblo ...
- mysql进阶-SQL优化篇
SQL优化 -插入数据 批量插入:(一次尽量不超过1000条) Insert into tb test values(1,'Tom'),(2,'cat'),(3, Jerny'); 手动事务提交: s ...
- WSL默认安装目录
我当前在win11下进行以下操作,其它系统版本有问题可以留言 一.安装WSL 前提条件:我们需要保证你的操作系统版本满足 **Windows 10 版本 2004 及更高版本(内部版本 19041 及 ...
- hydra爆破工具
hydra爆破工具 命令详细: 1.破解ssh: hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh hydra -l 用户名 -p 密码字典 -t 线程 -o s ...
- Vulhub 安装运行
前言 vulhub是利用docker技术做的一个漏洞复现平台,可以一键搭建对应的配置.在下载好对应的代码包后,不需要安装,只需要解压并利用3条命令,就可以简单的创建关闭对应漏洞环境.最好是购买一台阿里 ...
- 在 Kubernetes 中运行 Locust 与 Selenium:安装 Chrome 和 ChromeDriver
在现代软件开发中,性能和用户体验是至关重要的,而负载测试和自动化测试可以帮助我们实现这一目标.在本文中,我们将讨论如何在 Kubernetes 环境中运行 Locust 和 Selenium,并详细介 ...
- Angular 19 "要" 来了⚡
前言 Angular 19 预计会在 11 月中旬发布,目前 (2024-10-27) 最新版本是 v19.0.0-next.11. 这次 v19 的改动可不小哦,新增了很多功能,甚至连 effect ...
- 使用MySQL Workbench进行数据库备份
1.打开MySQL Workbench 2.进行数据库连接配置 如果之前连过,会有历史记录,直接点击需要备份的连接即可 3.进入主界面后,选择左侧的Administration选项卡,然后点击Data ...