Этот пример показывает, как анализировать гармоническое искажение слабо нелинейной системы в присутствии шума.
В этом примере мы исследуем выход упрощенной модели усилителя, который имеет шум, связанный с входным сигналом, и показывает нелинейность. Мы исследуем, как ослабление на входе может уменьшить гармоническое искажение. Мы также приведем пример, как математически исправить для искажения на выходе усилителя.
Удобным способом просмотреть эффект нелинейности усилителя является просмотр периодограммы его выхода при стимуляции синусоидой. Амплитуда синусоиды устанавливается на максимально допустимое напряжение усилителя. (2 Vpk)
В этом примере мы будем источником синусоиды 2 кГц в длительность мс.
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(outputVmax, Fs)
ans = 130.9300
Другой полезной метрикой для вычисления является SINAD. Это вычисляет отношение степени ко всем другим гармонике и содержимому шума в сигнале.
sinad(outputVmax, Fs)
ans = 60.3888
ТГД, ОСШ и 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 дБ. Это произошло за счет снижения ОСШ с 131 дБ до 125 дБ.
Может ли дальнейшее ослабление улучшить нашу общую эффективность искажения? Постройте график THD, ОСШ и 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 соответствует области значений, свободной от гармоник. Точно так же ОСШ соответствует динамической области значений, на который не влияет шум; SINAD соответствует общей динамической области значений, свободному от искажений.
Как видно из графика, ОСШ ухудшается, когда ослабление входной степени увеличивается. Это потому, что, когда вы ослабляете сигнал, только сигнал ослабляется, но шумовой пол усилителя остается неизменным.
Также обратите внимание, что величина общего гармонического искажения постоянно улучшается, пока она не пересекает кривую ОСШ, после чего измерение становится нестабильным. Это происходит, когда гармоники «исчезли» под шумом усилителя.
Практический выбор ослабления усилителя для усилителя был бы 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 дБ, сохраняя при этом наш исходный ОСШ 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 значительно улучшился, в то время как ОСШ не был затронут полиномиальной коррекцией. Это следует ожидать, поскольку полиномиальная коррекция влияет только на гармоническое искажение, а не на шумовое искажение.
Покажем максимально возможный 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')
Обратите внимание, что все гармоники, кроме второй, полностью исчезли с полиномиальной коррекцией при идеальной настройке ослабления. Как отмечалось до того, как вторая гармоника появится чуть ниже уровня степени общего noisefloor. Это обеспечивает разумный компромисс в приложениях, которые используют полную пропускную способность усилителя.
Мы показали, как полиномиальная коррекция может применяться к выходу усилителя, испытывающего искажение, и как выбрать разумное значение ослабления, чтобы уменьшить эффекты гармонического искажения.