本帖最后由 纪国圣 于 2022-2-8 18:10 编辑
在平时设计低频正弦波信号源时,一般使用如文氏桥的模拟电路或使用DAC输出的数字电路。用DAC产生正弦波具有使用方便,频率稳定的优点,一般加低通滤波就可以获得较好的正弦波。但在实际使用中,很少有资料说明一个周期的正弦波的采样率和DAC分辨率多少为合适。本帖尝试通过将DAC产生的正弦波进行傅里叶展开,通过谐波分析设置多少采样率和DAC分辨率以及滤波器阶数较为合适。 1. 对实际的DAC产生的正弦波做FFT,查看谐波分量并初步分析我们先对
的正弦波为例做FFT。首先该正弦波由12位的DAC产生,一个周期被等分为64份:设置做FFT的采样率为周期150*(512*64)Hz,则有 从以上频谱图可以发现一个很有意思的规律: 对于该正弦波,其具有调制信号的的频谱特性。首先在被等分的频率
的一个整数倍处具有一个相对较小值,在
处出现一个较大值。不过为何两者峰值会出现差异,有待后续分析。 2.理论分析
1)函数定义为了后续方便分析,正弦波的范围为
,也就是如下所示的样子: 2)函数缩放由于函数中有取整函数,不方便直接做傅里叶展开,因此将函数做一个缩放,通过上下边界来确定我们所要求的参数。 利用以下性质
进行函数缩放:
. 可以看出,函数的谐波成分主要和
有关,随着DAC的分辨率的增加,上下边界逐步靠近函数,但可惜的是这并不能有助于分析DAC的分辨率对生成曲线的影响。这一点后续再分析。 3)傅里叶展开令
,则有其中k=1,2,3......未列出部分n谐波系数值为0。 在这里可以看到各个n 次谐波系数与n次谐波的频率和正弦波被等分的数量有关,同时其系数在以
为中心
处有不为零的值,且两者值并不相等: 这一点与之前的FFT频谱图中看到的现象完全相同。 验证一下: 1>系数验证 注意,在这里求谐波系数时记得在公式里再乘以
。2>用系数拼出曲线 syms n;
m = 99;
T = 2*pi;
len = 1000;
k = fix((len-1)/m);
an = zeros(1,len);
bn = zeros(1,len);
an(1) = -m/pi*sin(pi/m)*sin(pi/m);
bn(1) = m/pi*sin(pi/m)*cos(pi/m);
for i = 1:1:k
an(m*i+1) = (-1)^((m-2)*i+1)*m/((m*i+1)*pi)*sin(pi/m)*sin(pi/m);
an(m*i-1) = (-1)^((m-2)*i)*m/((m*i-1)*pi)*sin(pi/m)*sin(pi/m);
bn(m*i+1) = (-1)^((m-2)*i)*m/((m*i+1)*2*pi)*sin(2*pi/m);
bn(m*i-1) = (-1)^((m-2)*i)*m/((m*i-1)*2*pi)*sin(2*pi/m);
end
% for i = 1:1:len
% if an(i) ~= 0
% fprintf('a%d is %f\n',num2str(i),num2str(an(i)))
% end
%
% if bn(i) ~= 0
% fprintf('b%d is %f\n',num2str(i),num2str(bn(i)))
% end
% end
k = 1;
for t = -pi:0.01:pi
sum = 0;
for n = 1:1:len
sum = sum + an(n)*cos(2*n*pi*t/T) + bn(n)*sin(2*n*pi*t/T);
end
y(k) = sum;
k = k + 1;
end
plot([-pi:0.01:pi],y)
grid on;
为了得到我们想要的正弦波信号,我们只需设置一个滤波器,将其上述谐波分量滤除即可。实际的滤波器不可能将这些谐波分量清为零,同时将谐波分量清为零也无意义。 我们一般使用THD来衡量正弦波的好坏: 对于本例,只要 就能得到想要的正弦波信号。如果不要求较高的m值,使用滤波器滤除,则有 其中
即为滤波器在
处的衰减量。 4)DAC位数选择(以下部分未给出严格证明,结论有武断的成分,欢迎大家给出严格的证明)由于我们不能从表达式中直接得出DAC分辨率对正弦波的影响,所以再次仿真查看: 可以看出DAC分辨率越高,其频谱越简洁,其中主要谐波分量越明显,同时其值也没有明显变化。所以可以推断DAC分辨率对DAC生成的正弦波的频谱没有太大的影响,不过为了得到较为干净的频谱,DAC分辨率又不能太低。 其实我们可以从另一个角度看这个问题。在做DAC生成正弦波信号时,一般是先用公式得到一张数据表,然后将表中的数字取整为DAC范围内的编码值,最后通过定时器发送给DAC生成信号。这一过程可以理解为将DAC范围内的编码值由线性规律排列“转换”为正弦规律排列。不过由于DAC范围内的编码值只能是线性规律排列,为了得到“正弦规律排列”,只能通过加大DAC分辨率,让正弦信号有给多选择区间的机会。 贴几张图让大家感受一下: 这里分为两种情况: 1>从正弦信号最密集处考虑 当k=1时,DAC分辨率与等分数量的关系如下图所示:
2>从正弦信号最稀疏处考虑 当k=1时,DAC分辨率与等分数量的关系如下图所示: 可以看到两种情况下的DAC分辨率不同,第二种情况下DAC分辨率要求比第一种要低很多,这是因为第二种情况不能保证正弦信号最密集点及其他区域的点不会“挤在”一个最小分辨率中。第一种情况下生成的正弦波的精度最高。实际选择DAC分辨率视实际需要而定。 3.实验验证为了得到一个THD<-55dBc 的正弦信号,设置DAC生成的正弦波被64等分,则由
得到DAC的位数为大于5,选择DAC的位数为8,初步计算得到的信号只有-37.4dBc,则需要加滤波器。计算使用2阶巴特沃斯低通滤波器,fc等于正弦信号频率,得到如下仿真结果: 由
得到DAC的位数为大于10,选择DAC的位数为12,初步计算得到的信号只有-37.4dBc,则需要加滤波器。计算使用2阶巴特沃斯低通滤波器,fc等于正弦信号频率,得到如下仿真结果:如果不使用滤波器,则根据公式
,k=5则m为999834,显然这么高的等分实际应用中是不可能的,因此滤波必不可少。
|
挺好