• 分析谐波失真


    目录

    简介

    查看非线性的影响

    量化非线性失真

    降低谐波失真的输入衰减

    SNR THD 和 SINAD 当作输入衰减的函数

    用于消除失真的后处理

    组合方法

    总结


            此示例说明如何分析在具有噪声的情况下弱非线性系统的谐波失真。

    简介

            在此示例中,我们将研究放大器的简化模型的输出,该放大器的噪声耦合到输入信号并且呈现非线性。我们将研究输入端的衰减如何降低谐波失真。我们还将举例说明如何对放大器输出端的失真在数学上进行校正。

    查看非线性的影响

            查看放大器非线性影响的一种方便方法是查看用正弦波激励时其输出的周期图。正弦波的幅值设置为放大器的最大允许电压。(2 Vpk)

            在此示例中,我们将提供持续时间为 50 毫秒的 2 kHz 正弦波。

    1. VmaxPk = 2; % Maximum operating voltage
    2. Fi = 2000; % Sinusoidal frequency of 2 kHz
    3. Fs = 44.1e3; % Sample rate of 44.1kHz
    4. Tstop = 50e-3; % Duration of sinusoid
    5. t = 0:1/Fs:Tstop; % Input time vector
    6. % Use the maximum allowable voltage of the amplifier
    7. inputVmax = VmaxPk*sin(2*pi*Fi*t);
    8. outputVmax = helperHarmonicDistortionAmplifier(inputVmax);

            查看输出正弦波的放大区域。请注意,在绘制对时间的图时,很难从视觉上看出放大器的不完美之处。

    1. plot(t, outputVmax)
    2. xlabel('Time')
    3. ylabel('Output Voltage')
    4. axis([0 5e-3 -2.5 2.5])
    5. title('Amplifier output')

            如图所示:

    现在我们来查看放大器输出的周期图。

    helperPlotPeriodogram(outputVmax, Fs, 'power','annotate');

            如图所示:

            请注意,我们不仅看到输入端的 2 kHz 正弦波,还看到 4 kHz、6 kHz、8 kHz 和 10 kHz 的其他正弦波。这些正弦波是 2 kHz 基频的倍数,这是由于放大器的非线性造成的。我们还看到相对平坦的噪声功率带。

    量化非线性失真

            为了便于比较,让我们参考一些常见的失真指标周期图显示一些定义良好的基波信号的谐波。该图建议我们测量输入信号的总谐波失真,它返回所有谐波含量的功率与基波信号的比率。

    thd(outputVmax, Fs)

             如图所示:

    ans = -60.3888

            请注意,第三个(也是最大的)谐波比基波低约 60 dB。大部分失真发生在此处。我们还可以获得输入中总噪声的估计值。为此,我们调用 SNR,它返回基波功率与所有非谐波含量功率的比率。

    snr(outputVmax, Fs)

            如图所示:

    ans = 130.9300

             另一个有用的计算指标是 SINAD。它计算功率与信号中所有其他谐波含量和噪声含量的比率。

    sinad(outputVmax, Fs)

            如图所示:

    ans = 60.3888

             THD、SNR 和 SINAD 分别为 -60 dB、131 dB 和 60 dB。由于 THD 的幅值与 SINAD 大致相等,我们可以推断大部分失真是由谐波失真引起的。如果我们检查周期图,会注意到第三个谐波是输出失真的主要原因。

    降低谐波失真的输入衰减

            大多数执行放大的模拟电路在谐波失真和噪声功率之间存在固有的折衷。在我们的示例中,与谐波失真相比,我们的放大器具有相对较低的噪声功率。这使得它适合检测低功率信号。如果我们的输入可以衰减到此低功率区域,我们可以还原一些谐波失真。

            让我们通过将输入电压降低二分之一来重复测量。

    1. inputVhalf = (VmaxPk/2) * sin(2*pi*Fi*t);
    2. outputVhalf = helperHarmonicDistortionAmplifier(inputVhalf);
    3. helperPlotPeriodogram(outputVhalf, Fs, 'power','annotate');

            如图所示:

            我们再次使用原先的指标,这次测量降低输入电压后的效果。

    1. %%
    2. thdVhalf = thd(outputVhalf, Fs)
    3. thdVhalf = -72.0676
    4. %%
    5. snrVhalf = snr(outputVhalf, Fs)
    6. snrVhalf = 124.8767
    7. %%
    8. sinadVhalf = sinad(outputVhalf, Fs)
    9. sinadVhalf = 72.0676

            请注意,简单地将输入功率水平衰减 6 dB 会降低谐波含量。SINAD 和 THD 从约 60 dB 提高到了约 72 dB。其代价是 SNR 从 131 dB 降低到了 125 dB。

    SNR THD 和 SINAD 当作输入衰减的函数

            进一步衰减能否改善整体失真表现?让我们将 THD、SNR 和 SINAD 绘制为输入衰减的函数,从而扫描从 1 dB 到 30 dB 的输入衰减器。

    1. % Allocate a table with 30 entries
    2. nReadings = 30;
    3. distortionTable = zeros(nReadings, 3);
    4. % Compute the THD, SNR and SINAD for each of the attenuation settings
    5. for i = 1:nReadings
    6. inputVbestAtten = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
    7. outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten);
    8. distortionTable(i,:) = [abs(thd(outputVbestAtten, Fs))
    9. snr(outputVbestAtten, Fs)
    10. sinad(outputVbestAtten, Fs)];
    11. end
    12. % Plot results
    13. plot(distortionTable)
    14. xlabel('Input Attenuation (dB)')
    15. ylabel('Dynamic Range (dB)')
    16. legend('|THD|','SNR','SINAD','Location','best')
    17. title('Distortion Metrics vs. Input Attenuation')

            如图所示:

            该图显示对应于每个指标的可用动态范围。THD 的幅值对应于无谐波的范围。同样,SNR 对应于不受噪声影响的动态范围;SINAD 对应于没有失真的总动态范围。

            从图中可以看出,SNR 随着输入功率衰减的增加而降低。这是因为当衰减信号时,只有信号在衰减,但放大器的本底噪声保持不变。

            还要注意,总谐波失真的幅值会稳步改善,直到它与 SNR 曲线相交,之后测量变得不稳定。当谐波在放大器的噪声下“消失”时,就会出现这种情况。

            放大器衰减的一个可行选择项是 26 dB(产生 103 dB 的 SINAD)。这是谐波和噪声失真之间的合理折衷。

    1. % Search the table for the largest SINAD reading
    2. [maxSINAD, iAtten] = max(distortionTable(:,3));
    3. fprintf('Max SINAD (%.1f dB) occurs at %.f dB attenuation\n', ...
    4. maxSINAD, iAtten)
    5. Max SINAD (103.7 dB) occurs at 26 dB attenuation

             让我们绘制衰减器设置为 26 dB 时的周期图。

    1. inputVbestAtten = db2mag(-iAtten) * VmaxPk * sin(2*pi*Fi*t);
    2. outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten);
    3. helperPlotPeriodogram(outputVbestAtten, Fs, 'power','annotate','shownoise');

            如图所示:

             我们还在此处绘制了分布在整个频谱中的噪声功率水平。请注意,在此衰减设置下,第二个和第三个谐波在频谱中仍然可见,但也远小于总噪声功率。如果我们的应用使用可用频谱的较小带宽,我们将从进一步增加衰减以降低谐波含量中受益。

    用于消除失真的后处理

            有时我们可以对放大器的一些非线性进行校正。如果放大器的输出经过数字化,我们可以通过对捕获的输出进行数字后处理并对非线性进行数学校正来还原更有用的动态范围。

            在我们的示例中,我们用线性斜坡激励输入,并拟合最适合输入的三次多项式。

    1. inputRamp = -2:0.00001:2;
    2. outputRamp = helperHarmonicDistortionAmplifier(inputRamp);
    3. polyCoeff = polyfit(outputRamp,inputRamp,3)
    4. polyCoeff = 1×4
    5. 0.0010 -0.0002 1.0000 -0.0250

             现在我们已经有系数,我们可以在输出端执行后校正,并与原始的未校正输出进行比较。

    1. correctedOutputVmax = polyval(polyCoeff, outputVmax);
    2. helperPlotPeriodogram([outputVmax; correctedOutputVmax],Fs,'power');
    3. subplot(2,1,1)
    4. title('Uncorrected')
    5. subplot(2,1,2)
    6. title('Polynomial Corrected')

            如图所示:

            请注意,使用多项式校正时,第二个和第三个谐波会显著降低。让我们用校正后的输出再次重复测量。

    1. thdCorrectedVmax = thd(correctedOutputVmax, Fs)
    2. thdCorrectedVmax = -99.6194
    3. %%
    4. snrCorrectedVmax = snr(correctedOutputVmax, Fs)
    5. snrCorrectedVmax = 130.7491
    6. %%
    7. sinadCorrectedVmax = sinad(correctedOutputVmax, Fs)
    8. sinadCorrectedVmax = 99.6162

            请注意,我们的 SINAD(和 THD)从 60 dB 下降到 99 dB,同时保持 131 dB 的原始 SNR。

    组合方法

            我们可以将衰减与多项式计算相结合,找到最大限度地降低系统整体 SINAD 的理想工作电压。

    1. subplot(1,1,1)
    2. % Add three more columns to our distortion table
    3. distortionTable = [distortionTable zeros(nReadings,3)];
    4. for i = 1:nReadings
    5. inputVreduced = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
    6. outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
    7. correctedOutput = polyval(polyCoeff, outputVreduced);
    8. distortionTable(i,4:6) = [abs(thd(correctedOutput, Fs))
    9. snr(correctedOutput, Fs)
    10. sinad(correctedOutput, Fs)];
    11. end
    12. h = plot(distortionTable)
    13. h =
    14. 6x1 Line array:
    15. Line
    16. Line
    17. Line
    18. Line
    19. Line
    20. Line
    21. %%
    22. xlabel('Input attenuation (dB)')
    23. ylabel('Dynamic Range (dB)')
    24. for i = 1:3
    25. h(i+3).Color = h(i).Color;
    26. h(i+3).LineStyle = '--' ;
    27. end
    28. legend('|THD| (uncorrected)','SNR (uncorrected)','SINAD (uncorrected)', ...
    29. '|THD| (corrected)','SNR (corrected)','SINAD (corrected)','Location','best')
    30. title('Distortion Metrics vs. Input Attenuation and Polynomial Correction');

            如图所示:

            在此处,我们对未校正的以及经过多项式校正的放大器的所有三个指标进行了绘图。从图中可以看出,THD 有显著的改进,而 SNR 不受多项式校正的影响。这在意料之中,因为多项式校正只影响谐波失真,而不影响噪声失真。

            让我们显示多项式校正时可能的最大 SINAD

    1. [maxSINADcorrected, iAttenCorr] = max(distortionTable(:,6));
    2. fprintf('Corrected: Max SINAD (%.1f dB) at %.f dB attenuation\n', ...
    3. maxSINADcorrected, iAttenCorr)
    4. Corrected: Max SINAD (109.7 dB) at 17 dB attenuation

             对于经过多项式校正的放大器,放大器衰减的一个良好选择项是 20dB(产生 109.8 dB 的 SINAD)。

    1. % Recompute amplifier at maximum SINAD attenuation setting with polynomial
    2. inputVreduced = db2mag(-iAttenCorr) * VmaxPk * sin(2*pi*Fi*t);
    3. outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
    4. correctedOutputVbestAtten = polyval(polyCoeff, outputVreduced);
    5. helperPlotPeriodogram(correctedOutputVbestAtten, Fs, 'power','annotate','shownoise');
    6. title('Periodogram of attenuated and polynomial corrected amplifier')

            如图所示:

            请注意,在理想衰减设置下,通过多项式校正,除了第二个谐波以外的所有谐波都应完全消失。如前所述,第二个谐波出现在总噪声基底功率水平的正下方。这在使用放大器全部带宽的应用中提供了合理的折衷。

    总结

            我们演示了如何对出现失真的放大器输出应用多项式校正,以及如何选择合理的衰减值来降低谐波失真的影响。

  • 相关阅读:
    SQLMAP自动注入
    微信小程序之vue按钮切换内容变化
    springboot+基层慢性病信息管理系统 毕业设计-附源码221550
    LeetCo
    批量导出导入数据及附件文件ZIP包
    基于PCA的特征提取和两级匹配的激光雷达SLAM(翻译)
    mockjs的基本使用和登录跳转到主页加折叠事件
    计算机毕业设计JavaNBA篮球资讯网(源码+系统+mysql数据库+lw文档)
    【LeetCode-中等题】 151. 反转字符串中的单词
    ora-00439 未启用 bit-mapped indexes
  • 原文地址:https://blog.csdn.net/jk_101/article/details/124795227