Main Content

高調波歪みの解析

この例では、ノイズが発生している状態で弱非線形システムの高調波歪みを解析する方法を示します。

はじめに

この例では、入力信号にノイズが連結されている、非線形性を示す増幅器の単純化モデルの出力をとりあげます。入力時の減衰によって高調波歪みがどのように減じられるかを調べます。また、増幅器の出力において歪みを数学的に補正する方法の例を提示します。

非線形性の影響の確認

増幅器の非線形性の影響を確認するうえで便利なのは、正弦波による入力刺激を受けたときの出力のピリオドグラムを表示するという方法です。正弦波の振幅は、増幅器で許容されている最大電圧に設定されます (2 Vpk)。

この例では、2 kHz の正弦波を 50 ms の間供給します。

VmaxPk = 2;       % Maximum operating voltage
Fi = 2000;        % Sinusoidal frequency of 2 kHz
Fs = 44.1e3;      % Sample rate of 44.1kHz
Tstop = 50e-3;    % Duration of sinusoid
t = 0:1/Fs:Tstop; % Input time vector

% Use the maximum allowable voltage of the amplifier
inputVmax = VmaxPk*sin(2*pi*Fi*t);
outputVmax = helperHarmonicDistortionAmplifier(inputVmax);

出力された正弦波の一部をズームインして表示します。時間を基準にプロットした場合、増幅器の欠点を視覚的に表示するのは困難です。

plot(t, outputVmax)
xlabel('Time')
ylabel('Output Voltage')
axis([0 5e-3 -2.5 2.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

3 番目の最も大きい高調波が基本波より約 60 dB 低くなっていることがわかります。ここで歪みの大部分が発生しています。

また、入力に存在するノイズ全体の推定値を求めることもできます。これを行うには、SNR を呼び出してすべての非高調波成分のパワーに対する基本波のパワーの比率を求めます。

snr(outputVmax, Fs)

ans = 130.9300

算出しておくと便利なもう 1 つの計量は SINAD です。これによって、パワーの、信号におけるその他のすべての高調波およびノイズ成分に対する比率が算出されます。

sinad(outputVmax, Fs)

ans = 60.3888

THD、SNR、SINAD は、それぞれ -60 dB、131 dB、60 dB でした。THD の大きさは SINAD とほぼ同じなので、歪みの大部分は高調波歪みが原因であると考えられます。

ピリオドグラムを調べてみると、3 番目の高調波が出力の歪みの大部分を占めることがわかります。

入力減衰による高調波歪みの抑制

増幅を行うほとんどのアナログ回路には、高調波歪みとノイズ パワーのトレードオフが内在的なものとして存在します。この例では、増幅器のノイズ パワーは高調波歪みと比較して低めになっています。そのため、パワーの低い信号の検出には適しています。入力を減衰させてこの低パワー領域に入れることができれば、高調波歪みをある程度回復できます。

係数を 2 として入力電圧を下げ、測定を繰り返してみます。

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

もう一度計量を行ってみます。今回は入力電圧を下げた影響を測定します。

thdVhalf = thd(outputVhalf, Fs)
thdVhalf = -72.0676
snrVhalf = snr(outputVhalf, Fs)
snrVhalf = 124.8767
sinadVhalf = sinad(outputVhalf, Fs)
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 までスイープしてみます。

% Allocate a table with 30 entries
nReadings = 30;
distortionTable = zeros(nReadings, 3);

% Compute the THD, SNR and SINAD for each of the attenuation settings
for i = 1:nReadings
  inputVbestAtten = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
  outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten);
  distortionTable(i,:) = [abs(thd(outputVbestAtten, Fs))
                          snr(outputVbestAtten, Fs)
                          sinad(outputVbestAtten, Fs)];
end

% Plot results
plot(distortionTable)
xlabel('Input Attenuation (dB)')
ylabel('Dynamic Range (dB)')
legend('|THD|','SNR','SINAD','Location','best')
title('Distortion Metrics vs. Input Attenuation')

グラフには、各計量に対応する使用可能なダイナミック レンジが示されます。そこでの THD の "大きさ" は、高調波のない範囲に対応します。同様に、SNR はノイズの影響を受けないダイナミック レンジに対応し、SINAD は歪みがない全ダイナミック レンジに対応します。

グラフからわかるように、SNR は入力パワーの減衰が大きくなるにつれ低下します。これは、信号を減衰させると信号のみが減衰し、増幅器のノイズ フロアは同じまま残るためです。

また、全高調波歪みの大きさは、SNR 曲線と交差するまで継続的に改善され、その後測定が不安定になります。これは、高調波が増幅器のノイズ中に "埋没" したための現象です。

増幅器の減衰値として実用的な値は 26 dB です (SINAD は 103 dB になります)。これが、高調波とノイズ歪みの間の妥当なトレードオフ水準となります。

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

減衰器が 26 dB に設定されている場合のピリオドグラムをプロットしてみましょう。

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

ここでは、スペクトル全体に広がっている "合計" ノイズ パワーのレベルを追加でプロットしました。この減衰設定では、2 番目と 3 番目の高調波はスペクトルで引き続き確認できますが、合計ノイズ パワーよりかなり低くなっています。使用可能なスペクトルより小さな帯域幅を使用するアプリケーションでは、減衰幅をさらに大きくして高調波成分を小さくするようにできます。

歪み除去のための事後処理

増幅器の非線形性の一部は、場合によっては補正できます。増幅器の出力がデジタル化されている場合、取得した出力をデジタルで事後処理し、非線形性を数学的に補正することにより、実用的なダイナミック レンジをより多く回復できます。

ここでは、線形ランプによる入力を行い、入力に最も適した 3 次多項式を当てはめます。

inputRamp = -2:0.00001:2;
outputRamp = helperHarmonicDistortionAmplifier(inputRamp);
polyCoeff = polyfit(outputRamp,inputRamp,3)
polyCoeff = 1×4

    0.0010   -0.0002    1.0000   -0.0250

係数が手に入ったので、出力での事後補正を実行して、元の未補正の出力と並べて比較できます。

correctedOutputVmax = polyval(polyCoeff, outputVmax);

helperPlotPeriodogram([outputVmax; correctedOutputVmax],Fs,'power');
subplot(2,1,1)
title('Uncorrected')
subplot(2,1,2)
title('Polynomial Corrected')

多項式補正を使用すると、2 番目と 3 番目の高調波が大幅に縮小することがわかります。

補正した出力を使い、測定をもう一度繰り返してみます。

thdCorrectedVmax = thd(correctedOutputVmax, Fs)
thdCorrectedVmax = -99.6194
snrCorrectedVmax = snr(correctedOutputVmax, Fs)
snrCorrectedVmax = 130.7491
sinadCorrectedVmax = sinad(correctedOutputVmax, Fs)
sinadCorrectedVmax = 99.6162

SINAD (および THD) は 60 dB から 99 dB に下がっていますが、SNR は元の 131 dB のまま変わっていません。

手法の結合

減衰と多項式評価を組み合わせると、システム全体の SINAD を最小化する理想的な動作電圧を求めることができます。

subplot(1,1,1)
% Add three more columns to our distortion table
distortionTable = [distortionTable zeros(nReadings,3)];
for i = 1:nReadings
  inputVreduced = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
  outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
  correctedOutput = polyval(polyCoeff, outputVreduced);
  distortionTable(i,4:6) = [abs(thd(correctedOutput, Fs))
                            snr(correctedOutput, Fs)
                            sinad(correctedOutput, Fs)];
end

h = plot(distortionTable)
h = 
  6x1 Line array:

  Line
  Line
  Line
  Line
  Line
  Line

xlabel('Input attenuation (dB)')
ylabel('Dynamic Range (dB)')
for i = 1:3
  h(i+3).Color = h(i).Color;
  h(i+3).LineStyle = '--' ;
end
legend('|THD| (uncorrected)','SNR (uncorrected)','SINAD (uncorrected)', ...
 '|THD| (corrected)','SNR (corrected)','SINAD (corrected)','Location','best')
title('Distortion Metrics vs. Input Attenuation and Polynomial Correction');

ここでは、未補正の増幅器と多項式補正された増幅器の両方について、3 つの計量すべてを並べてプロットしました。

グラフからわかるとおり、THD は大幅に改善されていますが、SNR は多項式補正の影響を受けていません。これは予想された結果です。多項式補正の影響を受けるのは高調波歪みだけで、ノイズ歪みは影響を受けないからです。

多項式で補正を受けた場合の SINAD の可能な最大値を表示してみましょう。

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

多項式で補正された増幅器の減衰値として適切な値は 20 dB です (SINAD は 109.8 dB になります)。

% Recompute amplifier at maximum SINAD attenuation setting with polynomial
inputVreduced = db2mag(-iAttenCorr) * VmaxPk * sin(2*pi*Fi*t);
outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
correctedOutputVbestAtten = polyval(polyCoeff, outputVreduced);

helperPlotPeriodogram(correctedOutputVbestAtten, Fs, 'power','annotate','shownoise');
title('Periodogram of attenuated and polynomial corrected amplifier')

理想的な減衰設定では、多項式補正により 2 番目の高調波以外のすべての高調波が完全に消失しています。前述のとおり、2 番目の高調波は合計ノイズ フロアのパワー レベルの直下に表示されます。これは、増幅器の帯域幅全体を使用するアプリケーションでは妥当なトレードオフとなります。

まとめ

歪みが発生している増幅器の出力に多項式補正を適用する方法と、高調波歪みの影響を抑えるための適切な減衰値を求める方法を示しました。

参考

| |