В этом примере показано, как анализировать гармонические искажения слабо нелинейной системы при наличии шума.
В этом примере мы рассмотрим выход упрощенной модели усилителя, который имеет шум, связанный с входным сигналом, и проявляет нелинейность. Рассмотрим, как затухание на входе может уменьшить гармонические искажения. Мы также дадим пример того, как математически исправить для искажения в продукции усилителя.
Удобным способом просмотра влияния нелинейности усилителя является просмотр периодограммы его выхода при стимулировании синусоидой. Амплитуда синусоиды устанавливается на максимально допустимое напряжение усилителя. (2 Vpk)
В этом примере мы будем получать синусоиду 2 кГц в течение 50 мс.
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 кГц синусоиды, которые мы разместили на входе, мы видим другие синусоиды на 4 кГц, 6 кГц, 8 кГц и 10 кГц. Эти синусоиды кратны основной частоте 2 кГц и обусловлены нелинейностью усилителя.
Мы также видим относительно плоскую полосу мощности шума.
Рассмотрим некоторые общие метрики искажений для сравнения
Наша периодограмма показывает некоторые очень четко определенные гармоники фундаментального сигнала. Это предполагает измерение полного гармонического искажения входного сигнала, которое возвращает отношение мощности всего гармонического содержания к основному сигналу.
thd(outputVmax, Fs)

ans = -60.3888
Обратите внимание, что третья и самая большая гармоника примерно на 60 дБ ниже фундаментальной. Именно здесь происходит большая часть искажений.
Мы также можем получить оценку общего шума, присутствующего на нашем входе. Для этого мы называем SNR, который возвращает отношение мощности основного к мощности всего негармонического содержания.
snr(outputVmax, Fs)

ans = 130.9300
Другой полезной метрикой для вычисления является SINAD. Это вычисляет отношение мощности ко всем другим гармоническим и шумовым содержимым в сигнале.
sinad(outputVmax, Fs)

ans = 60.3888
Значения THD, SNR и SINAD составляли соответственно -60 дБ, 131 дБ и 60 дБ. Поскольку величина THD примерно равна SINAD, можно отнести, что большая часть искажения обусловлена гармоническим искажением.
Если мы проверим периодограмму, мы можем заметить, что третья гармоника доминирует над искажением выходного сигнала.
Большинство аналоговых схем, выполняющих усиление, имеет собственный компромисс между гармоническими искажениями и мощностью шума. В нашем примере наш усилитель имеет относительно низкую мощность шума по сравнению с гармоническими искажениями. Это делает его пригодным для обнаружения маломощных сигналов. Если наш вход может быть ослаблен для входа в эту область низкой мощности, мы можем восстановить некоторые гармонические искажения.
Повторим измерения, снизив входное напряжение в два раза.
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 дБ снижает содержание гармоник. SINAD и THD улучшились с ~ 60 дБ до ~ 72 дБ. Это произошло за счет снижения SNR с 131 дБ до 125 дБ.
Может ли дальнейшее ослабление улучшить наши общие характеристики искажения? Давайте построим график THD, SNR и SINAD как функции ослабления входного сигнала, увеличивая входной аттенюатор от 1 до 30 дБ.
% 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 дБ (с получением SINAD 103 дБ). Это было бы разумным компромиссом между гармоническими и шумовыми искажениями.
% 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 дБ.
inputVbestAtten = db2mag(-iAtten) * VmaxPk * sin(2*pi*Fi*t); outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten); helperPlotPeriodogram(outputVbestAtten, Fs, 'power','annotate','shownoise');

Здесь мы дополнительно нанесли на график уровень суммарной мощности шума, который распределяется по спектру. Следует отметить, что при этой установке затухания вторая и третья гармоники все еще видны в спектре, но также значительно меньше, чем общая мощность шума. Если бы у нас было приложение, которое использует меньшую полосу пропускания доступного спектра, мы бы выиграли от дальнейшего увеличения затухания для уменьшения гармонического содержания.
Иногда мы можем исправить некоторую нелинейность усилителя. Если выходной сигнал усилителя оцифрован, мы можем восстановить более полезный динамический диапазон путем цифровой последующей обработки захваченного выходного сигнала и математической коррекции нелинейности.
В нашем случае мы стимулируем вход с помощью линейного клина и подгоняем полином третьего порядка, который лучше всего подходит для входа.
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')

Следует отметить, что вторая и третья гармоники значительно уменьшаются при использовании полиномиальной коррекции.
Повторим измерения еще раз с откорректированным выходом.
thdCorrectedVmax = thd(correctedOutputVmax, Fs)
thdCorrectedVmax = -99.6194
snrCorrectedVmax = snr(correctedOutputVmax, Fs)
snrCorrectedVmax = 130.7491
sinadCorrectedVmax = sinad(correctedOutputVmax, Fs)
sinadCorrectedVmax = 99.6162
Обратите внимание, что наш SINAD (и THD) упал с 60 дБ до 99 дБ, сохраняя при этом наш исходный SNR 131 дБ.
Мы можем объединить затухание с полиномиальной оценкой, чтобы найти идеальное рабочее напряжение, которое минимизирует общую 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');

Здесь мы нанесли на график все три метрики наряду с нескорректированным и полиномиальным скорректированным усилителем.
Как видно из графика, 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
Хороший выбор ослабления усилителя для полиномиально скорректированного усилителя был бы 20dB (давая SINAD 109,8 дБ).
% 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')

Заметим, что все, кроме второй гармоники, исчезли полностью с полиномиальной коррекцией при идеальной установке затухания. Как отмечалось ранее, вторая гармоника появляется чуть ниже уровня мощности полного шумового поля. Это обеспечивает разумный компромисс в приложениях, которые используют полную полосу пропускания усилителя.
Мы показали, как полиномиальная коррекция может быть применена к выходу усилителя, испытывающего искажения, и как выбрать разумное значение затухания, чтобы уменьшить эффекты гармонических искажений.