@[TOC]信号载频的测量-时域算法
一、时域算法原理
时域算法中比较常用的是过零点检测,首先估计出信号的平均过零点周期,然后利用信号的过零点周期估计出载波的周期。具体算法如下:
过零点检测:当
x
(
n
i
)
x(n_i)
x(ni)与
x
(
n
i
+
1
)
x(n_i+1)
x(ni+1)符号不同时,则区间
(
n
i
F
s
,
n
i
+
1
F
s
)
(\frac{n_i}{Fs},\frac{n_i+1}{Fs})
(Fsni,Fsni+1)存在零点,利用差值公式估计零点位置
α
(
i
)
\alpha\ (i)
α (i):
α
(
i
)
=
1
F
s
∗
[
n
i
+
x
(
n
i
)
x
(
n
i
)
+
x
(
n
i
+
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
∗
p
i
−
p
i
/
2
2
∗
p
i
∗
f
c
\alpha\ (i)=r(i)+\frac{i*pi-pi/2}{2*pi*fc}
α (i)=r(i)+2∗pi∗fci∗pi−pi/2
β
(
i
)
=
r
(
i
)
+
1
2
∗
f
c
\beta\ (i)=r(i)+\frac{1}{2*fc}
β (i)=r(i)+2∗fc1
r(i)表示由于噪声和测量等引起的误差变量,服从0均值的正态分布,
E
[
r
(
i
)
]
=
0
,
E
[
β
(
i
)
]
=
1
2
∗
f
c
E{[r(i)]}=0,E{[\beta(i)]}=\frac{1}{2*fc}
E[r(i)]=0,E[β(i)]=2∗fc1
则可以由相邻过零点的距离平均值估计出载波频率:
f
c
=
1
2
E
[
β
(
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。对于时域估计算法来说,信噪比越高,估计的越正确,其正确率可通过大量实验进行统计。因此,时域估计方法适用于信噪比较好的情况。