数字锁相放大器(DLIA)基本原理与Matlab仿真

2024-05-14 12:20

本文主要是介绍数字锁相放大器(DLIA)基本原理与Matlab仿真,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍数字锁相放大器(DLIA)基本原理与Matlab仿真。

1.基本原理

数字锁相放大器(DLIA)原理框图如下图。

其核心部分为FPGA/DSP内部的相关运算由正弦参考序列,D/A转换器,低通滤波器构成的DDS,DDS相关内容可以参考我以前的博文,这里对信号相关运算的原理作简要介绍。

设输入信号为携带噪声的信号x(t)=A_{I}\cdot sin(2\pi ft+\theta )+n(t),输入信号频率为f,采样频率为f_{s},令f_{s}=Nf(N\geq 3),采样间隔\tau =\frac{1}{Nf},对信号采样q个周期,总采样点数为M=qNn(t)为噪声信号。参考信号分别为正弦序列和余弦序列(采样点数和输入信号一致),由于输入信号与参考信号之间有相关性,与噪声之间几乎无关,故在下面的相关运算过程中,噪声项可忽略。对输入信号进行采样可得离散信号序列:

x(k)=A_{I}\cdot sin(2\pi fk\tau +\theta )=A_{I}\cdot sin(\frac{2k\pi}{N}+\theta) \, \, \, \, k=0,1,2... M-1

参考信号可以由FPGA/DSP内部生成(采用表格法),这里分别生成正弦参考序列(r_{s}(k))和余弦参考序列(r_{c}(k)):

r_{s}(k)=A_{R}\cdot sin(\tfrac{2k\pi}{N})\, \, \, \, k=0,1,2... M-1

r_{c}(k)=A_{R}\cdot cos(\tfrac{2k\pi}{N})\, \, \, \, k=0,1,2... M-1

这里注意输入信号的频率和参考信号的频率要相同。

x(k)r_{s}(k)的互相关R_{xr,s}x(k)r_{c}(k)的互相关R_{xr,c},即同相输出和正交输出的互相关信号为:

R_{xr,s}=\frac{1}{M-i}\sum_{k=0}^{M-i-1}x(k)\cdot r_{s}(k+i)=\frac{A_{I}A_{R}}{2}cos(2\pi fi+\theta)\, \, \, \, i=0,1,2...M-1

R_{xr,c}=\frac{1}{M-i}\sum_{k=0}^{M-i-1}x(k)\cdot r_{c}(k+i)=\frac{A_{I}A_{R}}{2}sin(2\pi fi+\theta)\, \, \, \, i=0,1,2...M-1

其中,R_{xr,s}R_{xr,c}采用的是无偏估计的相关运算。

从而可求得:

A_{I}(i)=\frac{2{\sqrt{R_{xr,s}^{2}(i)+R_{xr,c}^{2}(i)}}}{A_{R}}\, \, \, \, i=0,1,2...M-1

\theta (0)=arctan(\frac{R_{xr,c}(0)}{R_{xr,s}(0)})

2.Matlab仿真

这里,我们以输入信号fm=1000Hz,信噪比为-10dB(即噪声比信号强10倍),fs=100000Hz,为例,对上述原理进行仿真,Matlab代码如下:

fm=1000;
fs=100000;
N=fs/fm;
k=0:1:1000;
theta=pi/8;
x=sin(2*k*pi/N + theta);%原始信号
xn=awgn(x,-10,0);%对信号加噪
subplot(9,1,1);
plot(k,x);
title('x');
subplot(9,1,2);
plot(k,xn);
title('xn');
rs=sin(2*k*pi/N);%正弦信号
subplot(9,1,3);
plot(k,rs);
title('rs');
rc=cos(2*k*pi/N);%余弦信号
subplot(9,1,4);
plot(k,rc);
title('rc');rxs=xcorr(xn,rs,'unbiased',500);%与正弦信号作互相关
subplot(9,1,5);
plot(k,rxs);
title('rxs');
rxc=xcorr(xn,rc,'unbiased',500);%与余弦信号作互相关
subplot(9,1,6);
plot(k,rxc);
title('rxc');n = 10;
Wn = 0.3;
[b, a] = butter(n, Wn);rxs_filtered = filter(b, a, rxs);%对相关信号结果滤波
subplot(9,1,7);
plot(k,rxs_filtered);
title('rxs filtered');
rxc_filtered = filter(b, a, rxc);%对相关信号结果滤波
subplot(9,1,8);
plot(k,rxc_filtered);
title('rxc filtered');amp=2*sqrt(rxs_filtered.^2+rxc_filtered.^2);%计算幅值
subplot(9,1,9);
plot(k,amp);
title('amp');
p=atan(rxc_filtered(1)/rxs_filtered(1));%计算相位

其中,最核心的部分为相关运算(这里采用的是“unbiased”即无偏估计),相关运算计算可参考我以前的博文,这里不做过多叙述。仿真结果如下图。

从仿真结果可以看出,输出幅值,相位和原输入信号幅值,相位非常接近。

总结,本文介绍了数字锁相放大器(DLIA)基本原理与Matlab仿真。

这篇关于数字锁相放大器(DLIA)基本原理与Matlab仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988732

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

防盗链的基本原理与实现

我的实现防盗链的做法,也是参考该位前辈的文章。基本原理就是就是一句话:通过判断request请求头的refer是否来源于本站。(当然请求头是来自于客户端的,是可伪造的,暂不在本文讨论范围内)。首先我们去了解下什么是HTTP Referer。简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

AIGC6: 走进腾讯数字盛会

图中是一个程序员,去参加一个技术盛会。AI大潮下,五颜六色,各种不确定。 背景 AI对各行各业的冲击越来越大,身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为: 为国际跨境公司提供不同地区不同语言的客服外包解决方案,除了人力,还有软件系统。 软件系统主要是提供了客服跟客人的渠道沟通和工单管理,内部管理跟甲方的合同对接,绩效评估,BI数据透视。 客服跟客人

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python