代码片记录-使用DDC对两路信号相位差进行求取(matlab实现)

这篇具有很好参考价值的文章主要介绍了代码片记录-使用DDC对两路信号相位差进行求取(matlab实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考链接:

1、FPGA综合系统设计(七)基于DDC的两路信号相位差检测_fpga相位测量-CSDN博客 (真的太牛了)

2、双通道中频信号数字下变频及相位差估计(FPGA)_根据 i、q 两路信号以如何求出中频信号的频率和相位差-CSDN博客 (通过这个篇博客注意到了反正切的值域问题,里面其实还有fapa实现的具体实现,之后可以参考)

3、atan2函数的原理 - 百度文库 (baidu.com)  (反正切函数的相位矫正)

4、相位差_百度百科 (baidu.com)                   (相位差的定义,常识)

matlab的实现在F:\WorkSpace\practice\1、D9射频电源项目20240118-\我自己的之前找的资料\ADC采样\波形复原\DDC_WITH_PHASE_ABTAIN_REMOUDLE_DEMO_V1_0.m

思考:

1、使用iq解调的时候,iq的选取,不会影响幅值的求取,但是对相位的求取会有一定的影响,下面进行讨论:

  • A 、使用直接iq解调,在一路信号上求取幅值
  • 代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发
  • 最后求取的幅值都是Aif,但是这里求得的相位是中频的初始相位,是不会变化的,他和原始信号有个固定的关系
  • B、使用ddc的解调方式,选取两路作为iq信息
  • 代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发
  • 求得的也是幅值,但是相位是一个和时间有关的函数,是中频信号的实际相位,和时间有关的

最开始我的疑问点:

1、使用一路DDC求取所求取得到的相位信息是什么?

是混频之后的中频的真实(实时)相位,这个和时间有关,是一个中频频率和时间的函数,初始相位是原始信号和本征信号的相位差。

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

 

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

2、如何获得两路(电流电压)信号的相位差,将两个信号都进行下变频,将最后的相位信息相减,得到的就是两路信号的相位差,下面是推导过程

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

3、采用matlab进行仿真模拟

给出一个模拟的波形,电流和电压的相位相差40度,最终运算结果也是40度,有了这个数据之后可以计算驻波比,以及其它的有关阻抗匹配的参数了

原始信号存在相位差

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

通过计算得到相位差结果,比较稳定,原理参照上面的手写笔记

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

4、出现了一个问题,我好像都不知道着相位的定义了,里面并没有夹杂rf的实时相位呀,为啥会不到90,有一个一直是80的样子,有点奇怪哇,

问题找到了是反正切函数的值域问题,用的是两象限的反正切函数,值域是-0.5pi到0.5pi,需要对其进行矫正,但是我尝试了手动按照象限去矫正,相位的波形畸变严重,有没有其它的方法?

找到了修正方法,真的蠢好吧,之后还是可以按照这个实现的

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

代码片记录-使用DDC对两路信号相位差进行求取(matlab实现),matlab相关,fpga开发

4、程序记录文章来源地址https://www.toymoban.com/news/detail-850554.html

%% 描述
% V1.0--------基于IQ解调的说明
%       用于测试IQ正交解调,求幅值信息
%       使用了fir(汉宁窗口)滤波器对混频信号进行高频滤除
%       后记采用了滑动平均滤波器进行幅值输出
% V2.0------- 基于原始信号相位差求取实现
%       对两路原始信号分别进行DDC处理,得到相位信息之后,将两路相位相减,得到原始信号相位差啊
%       仿真验证这个是可行的,需要注意的点是反正切函数的值域问题,最开始就是因为这个没注意,然后走了很多弯路
%% 开始
close all;         %先关闭所有图片
clear all;

SW=1;              %信号源控制开关             0--lia 抓取数据   1--理想数据
SW1=1;             %数字滤波方法选择开关       0--平均值滤波     1--滑动窗口滤波 
SW2=1;             %低通滤波器选择开关         0--未知低通滤波   1--fir滤波器
SW3=0;             %数据突变控制开关           0--不开启数据突变 1--开启数据突变
%% 采样数据初始化
Fs=125000000;      %采样频率(Hz)
Ft=40680000;       %模拟信号频率 
N=511;             %采样点数
real_nums=N+1;
t=[0:1/Fs:N/Fs];   %采样时刻,表示采了多少个数据点
Fm=30000000;       %本征频率 30MHz
A1=1;              %本征信号的幅值
P1=0;              %本征信号相位 角度
P3=40;             %原始信号相位差定义 角度制
count=10;          %用于均值处理
for_nums=10;       %for循环次数
amp_filter=eye(1,real_nums); %存储滤波之后幅值数据

%% 本征信号生成 
sm1=A1*cos(2*pi*Fm*t+pi*P1/180);
sm2=-A1*sin(2*pi*Fm*t+pi*P1/180);

%% adc数据获取
if SW==0
sin_wave=eye(1,real_nums);
sheetname='sheet1';
filename='LIA采集到的adc数据用于matlab仿真fft.csv';
% Data=readtable(filename,'Sheet',sheetname);
data=xlsread(filename,'LIA采集到的adc数据用于matlab仿真fft','F2:F513');
sine_wave1(1:real_nums)=data';
end
if SW==1
    sine_wave1=600*cos(2*pi*Ft*t);
    sine_wave2=600*cos(2*pi*Ft*t+pi*P3/180);
end

%% 采样值突变
if SW3==1
    for i=200:210
        sine_wave1(i)=sine_wave1(i)*5*(i-200)/10;
    end
end

%% 显示原始信号
figure(1);
subplot(3,1,1);
plot(t,sine_wave1);
title('“电压”原始信号');
subplot(3,1,2);
plot(t,sine_wave2);
title('”电流“原始信号');
subplot(3,1,3);
plot(t,sm1);
title('本征信号');

%% IQ 正交处理
figure(2);
wave_of_deal_i1=sm1.*sine_wave1;
subplot(4,1,1);
plot(t,wave_of_deal_i1);
title('I1信号');

wave_of_deal_q1=sm2.*sine_wave1;
subplot(4,1,2);
plot(t,wave_of_deal_q1);
title('Q1信号');

wave_of_deal_i2=sm1.*sine_wave2;
subplot(4,1,3);
plot(t,wave_of_deal_i2);
title('I2信号');

wave_of_deal_q2=sm2.*sine_wave2;
subplot(4,1,4);
plot(t,wave_of_deal_q2);
title('I2信号');

%% 低通滤波
%   ----------------- 未知低通滤波方法
if SW2==0
result_wave_i=lowpass(wave_of_deal_i,10e6,30e6);
result_wave_q=lowpass(wave_of_deal_q,10e6,30e6);
end
%   ----------------- fir 低通滤波
if SW2==1
FilterLen = 512;          % 滤波器长度
FilterStep = FilterLen-1; % 滤波器阶数
FreqEnd  =15e6;           % 高截止频率
w2 = FreqEnd /Fs*2*pi;    % 归一化
window=hann(FilterLen);   % 汉宁窗,使得fir滤波器第一个旁瓣增益降低,改善滤波器性能
%window=rectwin(FilterLen); % 矩形窗,窗口区间都是为1

hn=fir1(FilterStep,w2/(pi),'low',window);                     % 生成低通滤波器,暂时没有使用,被滤波器设计器的滤波器取代
figure(3);
freqz(hn,1,512);
hm=hann_filter;
result_wave_i1 = conv(wave_of_deal_i1,hm.Numerator);          % 对原始序列和滤波器序列求卷积得到滤波后的结果
result_wave_q1 = conv(wave_of_deal_q1,hm.Numerator);          % 这里直接使用了滤波器设计工具生成的滤波器,但是都是hn窗的
result_wave_i1 = result_wave_i1(FilterLen/2:FilterLen/2+N);   % 滤波结果是居中的数据
result_wave_q1 = result_wave_q1(FilterLen/2:FilterLen/2+N);   % 滤波结果是居中的数据

result_wave_i2 = conv(wave_of_deal_i2,hm.Numerator);          % 对原始序列和滤波器序列求卷积得到滤波后的结果
result_wave_q2 = conv(wave_of_deal_q2,hm.Numerator);          % 这里直接使用了滤波器设计工具生成的滤波器,但是都是hn窗的
result_wave_i2 = result_wave_i2(FilterLen/2:FilterLen/2+N);   % 滤波结果是居中的数据
result_wave_q2 = result_wave_q2(FilterLen/2:FilterLen/2+N);   % 滤波结果是居中的数据
end

figure(4);
subplot(4,1,1);
plot(t,result_wave_i1);
title('i1低通处理');

subplot(4,1,2);
plot(t,result_wave_q1);
title('q1低通处理');

subplot(4,1,3);
plot(t,result_wave_i2);
title('i2低通处理');

subplot(4,1,4);
plot(t,result_wave_q2);
title('q2低通处理');
%% 幅值求取
amp=sqrt(result_wave_i1.*result_wave_i1+result_wave_q1.*result_wave_q1);
figure(5);
subplot(2,1,1);
plot(t,amp*2);   
title('幅值结果');

%% 均值滤波        每20个点求取一次均值
if SW1==0
    while count<real_nums
        amp_temp=0;
        for k=1:for_nums
            amp_temp=amp_temp+amp(count+k-for_nums);
        end
        count=count+1;
        amp_temp=amp_temp/for_nums;
        amp_filter(count)=amp_temp;
    end
end

%% 滑动窗口滤波
if SW1==1
    windowsize=10;
    b=(1/windowsize)*ones(1,windowsize);
    a=1;
    amp_filter=filter(b,a,amp);
end

subplot(2,1,2);
plot(t,amp_filter*2);   
title('滤波之后幅值');

%% 相位求取
figure(6);
% phase1=atan2(result_wave_q1,result_wave_i1)*180/pi;      %求四象限上的反正切,取值范围是-pi到pi
%---------------求两个象限上的反正切, 手动修正,效果相同--------------------%
phase1=atan(result_wave_q1./result_wave_i1)*180/pi;
%phase1的修正
for index=1:1:real_nums
    if and((result_wave_i1(index)>=0),(result_wave_q1(index)>=0)) %第一象限
       phase1(index)=phase1(index);
    end
    if and(result_wave_i1(index)<0,result_wave_q1(index)>=0)     %第二象限
       phase1(index)=phase1(index)+180;
    end
    if and(result_wave_i1(index)<0,result_wave_q1(index)<0 )     %第三象限
       phase1(index)=phase1(index)-180;
    end
    if and(result_wave_i1(index)>=0,result_wave_q1(index)<0)     %第四象限
       phase1(index)=phase1(index);
    end
end
%----------------------------end------------------------------------------%
subplot(3,1,1);
plot(t,phase1);
title('电压中频相位');

%  phase2=atan2(result_wave_q2,result_wave_i2)*180/pi;     %求四象限上的反正切,取值范围是-pi到pi
 %---------------求两个象限上的反正切, 手动修正,效果相同-------------------%
phase2=atan(result_wave_q2./result_wave_i2)*180/pi;
%phase2的修正
for index=1:1:real_nums
    if and((result_wave_i2(index)>=0),(result_wave_q2(index)>=0))%第一象限
       phase2(index)=abs(phase2(index));
    end
    if and(result_wave_i2(index)<0,result_wave_q2(index)>=0)     %第二象限
       phase2(index)=phase2(index)+180;
    end
    if and(result_wave_i2(index)<0,result_wave_q2(index)<0 )     %第三象限
       phase2(index)=phase2(index)-180;
    end
    if and(result_wave_i2(index)>=0,result_wave_q2(index)<0)     %第四象限
       phase2(index)=phase2(index);
    end
end
%----------------------------end------------------------------------------%
subplot(3,1,2);
plot(t,phase2);
title('电流中频相位');

detal=phase2-phase1;

% 直接求相位会出现错误,需要对计算相位进行修正
% 修正原则是当啊相位差超过pi时减去2pi,小于-pi时,加上2pi
for index=1:1:real_nums
    if detal(index)>180
        detal(index)= detal(index)-360;
    end
    if detal(index)<-180
        detal(index)= detal(index)+360; 
    end
end

subplot(3,1,3);
plot(t,detal);
title('原始信号相位差');


%% end


到了这里,关于代码片记录-使用DDC对两路信号相位差进行求取(matlab实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32不同频率两组倍频信号测量初相位

    先放我们需要的辅助电路的电路图 假设我们要测量的是X信号和Y信号的初相位差,我们可以将两组信号分别表示为和 。 很明显两组信号过零点的时间差乘以一个2就是相位差了。 为了方便测量我们先用一个过零比较器把信号变为方波  也就是我们只要测出红圈圈出的脉冲宽度

    2024年02月14日
    浏览(46)
  • 双PMOS管实现两路电源切换(电路非常经典、完美)仿真测试记录

    双PMOS管实现两路电源切换(电路非常经典、完美)仿真测试记录 双电源切换系统及切换方法 / CN109474060B 已经申请专利( 申请日 2018.12.19 )、 申请公布日 2019.03.15 、 授权公告日 2021.6.29,具体如下,Q1、Q2接不同的电源,这个电路非常经典、完美,对称,性价比非常高。 假设

    2024年01月15日
    浏览(43)
  • 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图

    一段音频信号在时域上,可以用一个实数向量来表示。这个数组的大小=采样率*音频时长。举个例子:一段采样率为8000,长15.6s的音频在matlab中表示为: 15.6x8000=124800大小的实数向量 下面是利用matlab读取.wav文件和.pcm文件的两种方法 从上图可以看出,音频信号在matlab中就是用一

    2024年02月05日
    浏览(96)
  • Simulink HDL Coder FPGA初级开发实践(五)FFT以及CORDIC算法进行信号相位校正

    前言: 本栏目除特别说明以外,均采用的黑金AX7103开发板,该开发板时钟频率为200M,并且是双端时钟,因此在每个项目中都有一段原语将双端时钟变成200MHz的单端时钟。文章仅作为学习记录,如有不足请在评论区指出,博主不会对各位的问题作出解答,请谅解。博主深知网

    2024年02月06日
    浏览(47)
  • labview图形显示正弦曲线信号发生器频率幅值相位数字示波器滤波器频谱分析

    wx供重浩:创享日记 对话框发送:labview图形 获取完整无水印报告+源程序文件 前面板. (1)添加1个波形图表控件:控件选板→新式→图形→波形图表。 (2)添加1个停止按钮:控件选板→新式-→布尔→停止按钮。 设计的程序前面板如图9-1所示。 框图程序 (1)添加1个除法函数:函数选

    2024年02月05日
    浏览(44)
  • 沁恒CH32V307使用记录:使用TIM输出PWM信号

    使用TIM输出PWM信号是单片机中比较常用的一个功能。这篇文章将对CH32V307中相关内容进行说明。 本文使用沁恒官方的开发板 (CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估板) 进行演示。 CH32V307拥有多个定时器,只有通用定时器和高级定时器支持PWM输出功能,需要注意的是不同的定

    2024年02月17日
    浏览(71)
  • 使用Gstreamer+OpenCV实现两路图像数据混合拉流推流

    本示例看完后,可基本掌握以下内容 1、利用opencv+gstreamer拉流推流的基本步骤 2、可学习gstreamer,图像混合的一些插件用法 3、TX2 NX上的视频编解码与硬件加速,H264编码参数调整 4、linux下如何提高线程优先级 我需要实现的功能是在TX2 NX上,拉取摄像头数据,并在摄像头数据上

    2024年02月09日
    浏览(42)
  • 【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及文献 文献来

    2024年02月07日
    浏览(59)
  • 使用MATLAB工具模拟单/双频GPS和载波相位差分GPS

    第一部分:介绍和背景 在我们的日常生活中,全球定位系统(GPS)发挥了重要的作用。无论是在我们的手机中,还是在各种应用中,GPS都是实现精确位置定位的关键技术。然而,有时候我们可能需要对GPS进行模拟,比如在测试新的算法或者进行系统设计时。为此,本文将详细

    2024年02月08日
    浏览(49)
  • 【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 维纳滤

    2024年02月14日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包