1.AM的模拟调制过程

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

其函数表达式如下:

\[s(t) = (A + m(t))*cos(2\pi ft + \varphi)
\]

其中:

A:表示基带信号加载的直流分量。

m(t):表示基带信号。

\(cos(2\pi ft + \varphi )\):表示载波信号。

正交调制法公式如下:

\[I(t) = (A + m(t))*cos(\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) = s(t)*cos(2\pi f_3t + \varphi) = (A + cos(2\pi f_1t))*cos(2\pi f_2t) *cos(2\pi f_3t + \varphi)
\]

根据三角函数公式:

\[\begin{split}
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}
\]

经过低通滤波器,不考虑滤波器增益:

\[I(t) = \frac{1}{2}Acos(2\pi (f_2 - f_3)t+\varphi) + \frac{1}{4}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)
\]

设解调的载波与调制的载波的频率偏移为f4:

\[f_4= f_3-f_2
\]

则:

\[I(t) = \frac{1}{2}Acos(2\pi f_4t+\varphi) + \frac{1}{4}cos(2\pi (f_1 + f_4)t+\varphi) + \frac{1}{4}cos(2\pi (f_1 - f_4)t+\varphi)
\]

同理可求得Q:

\[Q(t) = \frac{1}{2}Asin(2\pi f_4t+\varphi) + \frac{1}{4}sin(2\pi (f_1 + f_4)t+\varphi) + \frac{1}{4}sin(2\pi (f_1 - f_4)t+\varphi)
\]

还原信号:

\[s(t) = \sqrt{I(t)^2+Q(t)^2} = \frac{1}{2} (A + cos(2\pi f_1t))
\]

这样就消除了相位差带来的误差,同时这个有个前提:$$A + m(t)$$必须大于0,不过经过AM调制,一定是大于0的。否则将出现失真。

​ 由上式可以推断出解调的载波与调制的载波的频率偏移频率,只要位于设计的滤波器的带宽内,就可以解调出原始信号,与偏移量的大小无关。只要保证在获取I路信号和Q路信号的滤波器能正确将高频信号滤除,通过IQ求模,就可以成功将频差相位差两个变量消除。

3.去直流

​ 解调出来的信号中包含了一个直流信号A,在频谱分析中我们一般将直流信号当作频率为0的正弦信号,那么这样我们就可以通过滤波器的方式对直流进行处理。

1.均值滤波器

​ 将直流信号分量计算出来,将原信号减去直流信号就可以获取到基带信号。

\[m(t) = s(t) - A/2 = cos(2\pi f_1t)/2
\]

​ 均值滤波器表达式:

\[f(n) = \sum_{i=0}^{N-1} \frac{x(n+i)}{N}
\]

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的正交解调法的更多相关文章

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

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

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

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

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

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

  4. 【算法笔记】B1024 科学计数法

    1024 科学计数法 (20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位, ...

  5. OpenCV2.x自学笔记——最大类间方差法OTSU

    推荐用法:(参数勿动) threshold(gray,binary,0,255,CV_THRESH_OTSU+CV_THRESH_BINARY);

  6. 目标跟踪之Lukas-Kanade光流法

    转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...

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

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

  8. 目标跟踪之Lukas-Kanade光流法(转)

    光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...

  9. 事件分析法学习笔记(ESM)

    事件分析法基础学习笔记 1.定义   事件分析法是研究某事件的发生对组织价值的影响以及影响程度. 或者说研究特定事件对组织行为的影响. notes:事件分析法的关键点在于探讨所关注事件在某个时段产生的 ...

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

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

随机推荐

  1. Android Perfetto 系列 1:Perfetto 工具简介

    2019 年开始写 Systrace 系列,陆陆续续写了 20 多篇,从基本使用到各个模块在 Systrace 上的呈现,再到启动速度.流畅性等实战,基本上可以满足初级系统开发者和 App 开发者对于 ...

  2. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺

    7月份的国产数据库流行度排行榜已经揭晓.本期榜单展示的136个数据库中,近三分之二实现了评分增长.笔者认为这与6月份中国信通院发布第十二批大数据产品能力评测结果有关,65家企业的120款产品通过了本次 ...

  3. 反射获取Exception的所有类

    var test = "test"; $"{test} 喜喜".Dump(); // 反射 var types = Assembly .GetAssembly( ...

  4. 09 什么是注意力机制(Attention )

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

  5. 关系图谱后端不给指向性字段使用children

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. nvm安装使用教程

    一.简介 既然你来了,那就不用解释太多,只需要知道 nvm是一款nodejs版本管理工具,通过它可以让我们切换不同版本的 nodejs. 二.下载nvm 1.在安装nvm之前,你要先确定是否安装了no ...

  7. go:极简上手使用 stretchr/testify 进行mock测试

    库安装 首先,安装 Mock 类生成工具 Mockery: go install github.com/vektra/mockery/v2@v2.45.1 实际上,你也可以手动创建 Mock 类. 生 ...

  8. windows涉及所有协议及默认端口

    名称 协议 端口 说明 echo tcp/udp 7 echo服务 discard tcp/udp 9 用于连接测试的空服务 systat tcp/udp 11 链接端口系统状态 daytime tc ...

  9. Linux利用crontab命令定时任务

    系统配置文件/etc 系统周期性所要执行的工作,比如写缓存数据到硬盘.日志清理等.在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件. /etc/crontab文件大概包括下面几 ...

  10. Large Language Model主题的若干论文简述

    1. Architectural Components of Large Language Models (LLMs) SentencePiece: A simple and language ind ...