论坛风格切换切换到宽版
  • 1960阅读
  • 3回复

关于自制VNA的谐波抑制 [复制链接]

上一主题 下一主题
离线MF35_
 
发帖
179
只看楼主 倒序阅读 0楼 发表于: 2020-09-11
多年前N2PK VNA挺火的,我也自制了一块,花了差不多近1000大洋,用的myVNA这个软件,随后因为要带电脑使用不方便,就一直闲置。
最近心血来潮,想把这玩意儿改成自带LCD显示的独立设备(我在最初设计板子的时候各个部分是分离的),所以又去翻了下Paul Kiciak的网站了解下更多信息,这个网站已经关掉了,我在另一个地方找到了备份。
有个网页中提到了,测量时会因为谐波的影响产生“假像”,Paul使用了一种谐波抑制的算法来去除这个影响,但该算法的原理网页中并未给出。Dave Roberts的myVNA软件也包含了这个算法。
为此我写邮件给Paul希望能介绍下这个算法的原理,但Paul表示这个算法是不开源的,然后给了我一篇他在Yahoo社区发的贴子,里面提到使用不同的相位进行采样,所以我研究了下找到了下面的方法,写出来大家讨论。
我们知道N2PK分别使用0和90度相位的参考信号和目标信号相乘,然后取直流分量得到目标信号在X轴和Y轴的投影,实现向量测量,实际测量中,使用的是CDS算法,即使用0度和180度参考的采样值相减得到X轴投影,使用90度和270度参考采样值相减得到Y轴投影,这个方法可以去除直流偏移和偶次谐波带来的误差。分析了CDS算法的原理,发现其就是数字相干检波(单点DFT)的一种特例。
下面说谐波抑制的方法。

将参考信号以45度相位进行步进,采样8个值,那么各个采样值的含义如下:

v0 = offset + a1*cos(x)      + a2*cos(2x)      + a3*cos(3x)      + a4*cos(4x)   + a5*cos(5x)    ...
v1 = offset + a1*cos(x+1/4π) + a2*cos(2x+2/4π) + a3*cos(3x+3/4π) + a4*cos(4x+π) + a5*cos(5x+5/4π) ...
v2 = offset + a1*cos(x+2/4π) + a2*cos(2x+4/4π) + a3*cos(3x+6/4π) + a4*cos(4x)   + a5*cos(5x+2/4π) ...
v3 = offset + a1*cos(x+3/4π) + a2*cos(2x+6/4π) + a3*cos(3x+1/4π) + a4*cos(4x+π) + a5*cos(5x+7/4π) ...
v4 = offset + a1*cos(x+π)    + a2*cos(2x)      + a3*cos(3x+π)    + a4*cos(4x)   + a5*cos(5x+π)    ...
v5 = offset + a1*cos(x+5/4π) + a2*cos(2x+2/4π) + a3*cos(3x+7/4π) + a4*cos(4x+π) + a5*cos(5x+1/4π) ...
v6 = offset + a1*cos(x+6/4π) + a2*cos(2x+4/4π) + a3*cos(3x+2/4π) + a4*cos(4x)   + a5*cos(5x+6/4π) ...
v7 = offset + a1*cos(x+7/4π) + a2*cos(2x+6/4π) + a3*cos(3x+5/4π) + a4*cos(4x+π) + a5*cos(5x+3/4π) ...

这里x的含义是基波的相位,观察v0到v7,如果我们把cos(x)当作基波信号,是不是和“对一个包含谐波的正弦波每周期进行8次均匀采样”得到的结果一样?
这样问题就简单了,要取出cos(x)或sin(x),甚至cos(nx)或sin(nx),只需要对这个序列进行数字相干检波,即单点DFT算法,取出期望的分量即可。

前面说了CDS其实是这个算法的一个特例,对于CDS,相当于对cos(x)每周期采样4次(即v0, v2, v4, v6),对cos(x)进行数字相干检波时,需要一个余弦表[1, 0, -1, 0],需要一个正弦表[0, 1, 0, -1],进行单点DFT,则cos(x) = (v0 * 1 + v2 * 0 + v4 * -1 + v6 * 0) * 2 / 4,这里先乘以2是因为a1这个系数是基于1/2的(经过乘法器相乘)
sin(x) = (v0 * 0 + v2 * 1 + v4 * 0 + v6 * -1) * 2 / 4所以cos(x) = (v0 - v4) / 2,即0度参考采样值和180度参考采样值相减,sin(x)类似。

直流偏移可以认为是一个特殊的谐波(0次谐波),它永远在DFT的奈奎斯特点以内,所以单点DFT算法可以消除它,对于4个采样点的DFT来说,2次谐波刚好落在奈奎斯特点,而这个点的数学响应是0,同样其他偶次谐波虽然都在奈奎斯特区以外,但其镜像经过混叠,刚好出现在奈奎斯特点,所以统统消失了。对于奇次谐波,均在奈奎斯特区以外,而且会混叠到内奎斯特区,因此4点CDS算法无法取出奇次谐波的影响。

用这个方法可以从采样数据中分离出想要的分量,所以可以消除谐波,同样的,如果你的VNA激励信号和参考信号使用的是谐波丰富的源,比如方波,这个方法还可以检出特定的谐波,从而扩展VNA的频率范围,当然,因为方波中的谐波幅度更低,所以动态范围是要缩减的,但这依然是一个好方法。Dave Roberts的myVNA软件现在也包含这个功能。

要分离出特定的分量,则采样点的数量必须使得该分量落在奈奎斯特区以内,比如要分离3次谐波,至少需要6个采样点(60度步进),要分离5次谐波,至少需要10个采样点(36度步进)。
[ 此帖被MF35_在2020-09-11 14:59重新编辑 ]
离线MF35_
发帖
179
只看该作者 1楼 发表于: 2020-09-11
主楼的表有点问题,应该是这样的
v0 = offset + a1*cos(x1)      + a2*cos(x2)      + a3*cos(x3)      + a4*cos(x4)   + a5*cos(x5) ...
v1 = offset + a1*cos(x1+1/4π) + a2*cos(x2+2/4π) + a3*cos(x3+3/4π) + a4*cos(x4+π) + a5*cos(x5+5/4π) ...
v2 = offset + a1*cos(x1+2/4π) + a2*cos(x2+4/4π) + a3*cos(x3+6/4π) + a4*cos(x4)   + a5*cos(x5+2/4π) ...
v3 = offset + a1*cos(x1+3/4π) + a2*cos(x2+6/4π) + a3*cos(x3+1/4π) + a4*cos(x4+π) + a5*cos(x5+7/4π) ...
v4 = offset + a1*cos(x1+π)    + a2*cos(x2)      + a3*cos(x3+π)    + a4*cos(x4)   + a5*cos(x5+π)    ...
v5 = offset + a1*cos(x1+5/4π) + a2*cos(x2+2/4π) + a3*cos(x3+7/4π) + a4*cos(x4+π) + a5*cos(x5+1/4π) ...
v6 = offset + a1*cos(x1+6/4π) + a2*cos(x2+4/4π) + a3*cos(x3+2/4π) + a4*cos(x4)   + a5*cos(x5+6/4π) ...
v7 = offset + a1*cos(x1+7/4π) + a2*cos(x2+6/4π) + a3*cos(x3+5/4π) + a4*cos(x4+π) + a5*cos(x5+3/4π) ...
x1是基波相位,x2~x5分别是基波和谐波的相位,它们不一定是基波相位的倍数,但因为谐波相位的微分是基波相位微分的倍数,可以认为cos(xn)的角频率是cos(x1)的倍数,所以不影响计算。
[ 此帖被MF35_在2020-09-11 15:31重新编辑 ]
离线BG5TOX
发帖
798
只看该作者 2楼 发表于: 2020-09-11
Callsign:BG5TOX
QQ:327586364
离线child@BY1QH
发帖
1285
只看该作者 3楼 发表于: 2020-09-12
nanoVNA更极端,测试信号和参考信号都是方波。测试信号和参考信号有个频率差,直接出音频信号。然后只看差频的基波分量就可以了。
BG1NAL(2005-2009), BD1NAL(2009-2014),BG1NAL(2016-),AG5JX(2017-)