Визуализируйте нарушения РФ

Примените различные нарушения РФ к сигналу QAM. Наблюдайте эффекты при помощи схем совокупности, изменяющихся во времени графиков значения вектора ошибок (EVM) и графиков спектра. Оцените эквивалентное отношение сигнал-шум (SNR).

Инициализация

Установите частоту дискретизации, порядок модуляции и ОСШ. Вычислите ссылочные точки совокупности.

fs = 1000;
M = 16;
snrdB = 30;
refConst = qammod(0:M-1,M,'UnitAveragePower',true);

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

constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);
timeScope = dsp.TimeScope('YLimits',[0 40],'SampleRate',fs,'TimeSpan',1, ...
    'ShowGrid',true,'YLabel','EVM (%)');

Белый шум

Сгенерируйте 16-QAM сигнал и передайте его через канал AWGN. Постройте его совокупность.

data = randi([0 M-1],1000,1);
modSig = qammod(data,M,'UnitAveragePower',true);
noisySig = awgn(modSig,snrdB);

constDiagram(noisySig)

Оцените EVM сигнала с шумом от ссылочных точек совокупности.

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power');

rmsEVM = evm(noisySig)
rmsEVM =

    3.1768

Коэффициент ошибок модуляции (MER) тесно соответствует ОСШ. Создайте объект MER и оцените ОСШ.

mer = comm.MER('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst);
snrEst = mer(noisySig)
snrEst =

   30.1071

Оценка вполне близко к заданному ОСШ 30 дБ.

Искажение усилителя

Создайте усилитель с помощью объекта нелинейности без памяти.

amp = comm.MemorylessNonlinearity('IIP3',38,'AMPMConversion',0);

Передайте модулируемый сигнал через нелинейный усилитель и постройте его схему совокупности.

txSig = amp(modSig);
constDiagram(txSig)

Угловые точки совокупности переместились к источнику из-за сжатия усиления усилителя.

Введите маленькое преобразование AM/PM и отобразите полученное сигнальное созвездие.

amp.AMPMConversion = 1;
txSig = amp(modSig);
constDiagram(txSig)

Совокупность вращалась из-за преобразования AM/PM. Чтобы вычислить изменяющийся во времени EVM, выпустите объект EVM и установите свойство AveragingDimensions на 2. Чтобы оценить EVM по входному сигналу, не используйте определение свойства ReferenceSignalSource. Этот метод приводит к более точным результатам.

evm = comm.EVM('AveragingDimensions',2);
evmTime = evm(modSig,txSig);

Постройте изменяющийся во времени EVM искаженного сигнала.

timeScope(evmTime)

Вычислите RMS EVM.

evmRMS = sqrt(mean(evmTime.^2))
evmRMS =

   35.5919

Вычислите MER.

mer = comm.MER;
snrEst = mer(modSig,txSig)
snrEst =

    8.1392

ОСШ (≈8 дБ) уменьшается от его начального значения (∞) из-за искажения усилителя.

Задайте уровни входной мощности в пределах от от 0 до 40 dBm. Преобразуйте те уровни в их линейный эквивалент в W. Инициализируйте вектор выходной мощности.

powerIn = 0:40;
pin = 10.^((powerIn-30)/10);
powerOut = zeros(length(powerIn),1);

Измерьте выходную мощность усилителя для области значений уровней входной мощности.

for k = 1:length(powerIn)
    data = randi([0 15],1000,1);
    txSig = qammod(data,16,'UnitAveragePower',true)*sqrt(pin(k));
    ampSig = amp(txSig);
    powerOut(k) = 10*log10(var(ampSig))+30;
end

Постройте выходную мощность по сравнению с кривой входной мощности.

figure
plot(powerIn,powerOut,powerIn,powerIn,'--')
legend('Amplifier Output','Ideal Output','location','se')
xlabel('Power In (dBm)')
ylabel('Power Out (dBm)')
grid

Выходная мощность выравнивается в 30 dBm. Усилитель показывает нелинейное поведение для уровней входной мощности, больше, чем 25 dBm.

Неустойчивость I/Q

Примените амплитуду и неустойчивость фазы к модулируемому сигналу.

ampImb = 3;
phImb = 10;
gainI = 10.^(0.5*ampImb/20);
gainQ = 10.^(-0.5*ampImb/20);
imbI = real(modSig)*gainI*exp(-0.5i*phImb*pi/180);
imbQ = imag(modSig)*gainQ*exp(1i*(pi/2 + 0.5*phImb*pi/180));
rxSig = imbI + imbQ;

Постройте полученную совокупность.

constDiagram(rxSig)

Значение и фаза совокупности изменились в результате неустойчивости I/Q.

Вычислите и постройте изменяющийся во времени EVM.

evmTime = evm(modSig,rxSig);
timeScope(evmTime)

EVM показывает поведение, которое подобно испытанному с нелинейным усилителем, хотя отклонение меньше.

Создайте синусоиду на 100 Гц, имеющую частоту дискретизации на 1 000 Гц.

sinewave = dsp.SineWave('Frequency',100,'SampleRate',1000, ...
    'SamplesPerFrame',1e4,'ComplexOutput',true);

x = sinewave();

Примените те же 3 дБ и 10 степеней неустойчивость I/Q.

ampImb = 3;
phImb = 10;
gainI = 10.^(0.5*ampImb/20);
gainQ = 10.^(-0.5*ampImb/20);
imbI = real(x)*gainI*exp(-0.5i*phImb*pi/180);
imbQ = imag(x)*gainQ*exp(1i*(pi/2 + 0.5*phImb*pi/180));
y = imbI + imbQ;

Постройте спектр неустойчивого сигнала.

spectrum = dsp.SpectrumAnalyzer('SampleRate',1000,'PowerUnits','dBW');

spectrum(y)

Неустойчивость I/Q вводит второй тон на уровне-100 Гц, который является инверсией входного тона.

Шум фазы

Примените шум фазы к переданному сигналу. Постройте получившуюся схему совокупности.

pnoise = comm.PhaseNoise('Level',-50,'FrequencyOffset',20,'SampleRate',fs);
pnoiseSig = pnoise(modSig);
constDiagram(pnoiseSig)

Шум фазы вводит вращательное дрожание.

Вычислите и постройте EVM полученного сигнала.

evmTime = evm(modSig,pnoiseSig);
timeScope(evmTime)

Определите RMS EVM.

evmRMS = sqrt(mean(evmTime.^2))
evmRMS =

    6.1989

Отфильтруйте эффекты

Задайте выборки на параметр символа. Создайте пару повышенных согласованных фильтров косинуса.

sps = 4;
txfilter = comm.RaisedCosineTransmitFilter('RolloffFactor',0.2,'FilterSpanInSymbols',8, ...
    'OutputSamplesPerSymbol',sps,'Gain',sqrt(sps));

rxfilter = comm.RaisedCosineReceiveFilter('RolloffFactor',0.2,'FilterSpanInSymbols',8, ...
    'InputSamplesPerSymbol',sps,'Gain',1/sqrt(sps), ...
    'DecimationFactor',sps);

Определите задержку через согласованные фильтры.

fltDelay = 0.5*(txfilter.FilterSpanInSymbols + rxfilter.FilterSpanInSymbols);

Передайте модулируемый сигнал через согласованные фильтры.

filtSig = txfilter(modSig);
rxSig = rxfilter(filtSig);

Чтобы составлять задержку через фильтры, отбросьте первые выборки fltDelay.

rxSig = rxSig(fltDelay+1:end);

Чтобы разместить изменение в количестве полученных выборок сигнала, создайте новую схему совокупности и объекты осциллографа времени.

constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);
timeScope = dsp.TimeScope('YLimits',[0 40],'SampleRate',fs,'TimeSpan',1, ...
    'ShowGrid',true,'YLabel','EVM (%)');

Оцените EVM. Постройте полученную схему сигнального созвездия и изменяющийся во времени EVM.

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power','AveragingDimensions',2);
evmTime = evm(rxSig);
constDiagram(rxSig)
timeScope(evmTime)

Определите RMS EVM.

evmRMS = sqrt(mean(evmTime.^2))
evmRMS =

    2.7199

Определите эквивалентный ОСШ.

mer = comm.MER;
snrEst = mer(modSig(1:end-fltDelay),rxSig)
snrEst =

   31.4603

Совместное воздействие

Объедините эффекты фильтров, нелинейного усилителя, AWGN и шума фазы. Отобразите схемы EVM и совокупность.

Создайте EVM, осциллограф времени и объекты схемы совокупности.

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power','AveragingDimensions',2);
timeScope = dsp.TimeScope('YLimits',[0 40],'SampleRate',fs,'TimeSpan',1, ...
    'ShowGrid',true,'YLabel','EVM (%)');
constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);

Задайте нелинейный усилитель и объекты шума фазы.

amp = comm.MemorylessNonlinearity('IIP3',45,'AMPMConversion',0);
pnoise = comm.PhaseNoise('Level',-55,'FrequencyOffset',20,'SampleRate',fs);

Отфильтруйте и затем усильте модулируемый сигнал.

txfiltOut = txfilter(modSig);
txSig = amp(txfiltOut);

Добавьте шум фазы. Передайте сигнал, которому повреждают, через канал AWGN. Постройте схему совокупности.

rxSig = awgn(txSig,snrdB);
pnoiseSig = pnoise(rxSig);
rxfiltOut = rxfilter(pnoiseSig);
constDiagram(rxfiltOut)

Вычислите изменяющийся во времени EVM. Постройте результат.

evmTime = evm(rxfiltOut);
timeScope(evmTime)

Определите RMS EVM.

evmRMS = sqrt(mean(evmTime.^2))
evmRMS =

    6.6444

Оцените ОСШ.

mer = comm.MER('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst);
snrEst = mer(rxfiltOut)
snrEst =

   23.6978

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

Смотрите также

|