@[TOC]信号载频的测量-时域算法
一、时域算法原理
时域算法中比较常用的是过零点检测,首先估计出信号的平均过零点周期,然后利用信号的过零点周期估计出载波的周期。具体算法如下:
过零点检测:当x(ni)x(n_i)x(ni)与x(ni+1)x(n_i+1)x(ni+1)符号不同时,则区间(niFs,ni+1Fs)(\frac{n_i}{Fs},\frac{n_i+1}{Fs})(Fsni,Fsni+1)存在零点,利用差值公式估计零点位置α (i)\alpha\ (i)α (i):
α (i)=1Fs∗[ni+x(ni)x(ni)+x(ni+1)] \alpha\ (i)=\frac{1}{Fs} *[n_i+\frac{x(n_i)}{x(n_i)+x(n_i+1)}]α (i)=Fs1∗[ni+x(ni)+x(ni+1)x(ni)]
其中,x(n)为采样序列,Fs为采样率。
令β(i)\beta(i)β(i)表示第i个零点和第i+1个零点之间的距离,其中:β (i)=α(i)−α(i+1)\beta\ (i) =\alpha(i)-\alpha(i+1)β (i)=α(i)−α(i+1)
对于正弦信号来说,零点位置α(i)\alpha(i)α(i)和相邻零点之间的距离β(i)\beta(i)β(i)和载波频率的关系分别为:
α (i)=r(i)+i∗pi−pi/22∗pi∗fc \alpha\ (i)=r(i)+\frac{i*pi-pi/2}{2*pi*fc}α (i)=r(i)+2∗pi∗fci∗pi−pi/2
β (i)=r(i)+12∗fc \beta\ (i)=r(i)+\frac{1}{2*fc}β (i)=r(i)+2∗fc1
r(i)表示由于噪声和测量等引起的误差变量,服从0均值的正态分布,E[r(i)]=0,E[β(i)]=12∗fcE{[r(i)]}=0,E{[\beta(i)]}=\frac{1}{2*fc}E[r(i)]=0,E[β(i)]=2∗fc1
则可以由相邻过零点的距离平均值估计出载波频率:
fc=12E[β(i)] fc = \frac{1}{2E[\beta(i)]}fc=2E[β(i)]1
二、Matlab程序
1.代码
%--------------function:measure carrier frequency----------------
%--------------remark: use time-domain analysis
%--------------data:2024.07.29----------------------------------
%--------------author:Clemence----------------------------------
clc;
clear all;
close all;
%-----signal paras-------
f = 14e6; %signal frequency
phase = 0; %initial phase
a = 1; %amplitude
b = 0; %offs
%-----sample paras-------
N=4096; %sample points
Fs = 100e6; %sample frequency
ts = 1/Fs; %sample interval
t = 0:ts:(N-1)*ts; %sample time
%-----time-domain singal-----------------
s = a*cos(2*pi*f*t+phase)+b;
s = awgn(s,3);
%-----create carrier---------------------
fc = 20e6;
s_fc = cos(2*pi*fc*t);
%----- AM--------------------------------
ma = 0.5; % am coefficient
A = a/ma;
s_am = (A+s).*s_fc;
%------calculate all zero points of signal
i = 1;
for k=1:N-1
s_sign = s_am(k)*s_am(k+1);
if(s_sign<=0)
alpha(i) = (1/Fs)*(k+s_am(k)/(s_am(k)+s_am(k+1)));
i = i+1;
end
end
%-----calculate carrier frequency----------
for i=1:length(alpha)-1
belt(i) = alpha(i+1)-alpha(i);
end
fc = (length(alpha)-1)/(2*sum(belt));
str_fc = ['fc =',num2str(fc/1e6),'e6'];
%-----plot AM spectrum -------------------
s_fft = abs(fft(s_am));
index = (0:N/2-1)*(Fs/N);
plot(index,s_fft(1:N/2));
xlabel('f');
ylabel('amp');
title('calcute carrier frequency(SNR=3)');
legend(str_fc);
2.仿真结果


三、结果分析
本示例中,仿真信号为AM调制方式,载波频率20MHz。当SNR=3dB时,估计的载波频率为20.36MHz,当SNR=6dB时,估计的载波频率为20.138MHz。对于时域估计算法来说,信噪比越高,估计的越正确,其正确率可通过大量实验进行统计。因此,时域估计方法适用于信噪比较好的情况。

242

被折叠的 条评论
为什么被折叠?



