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

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

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

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

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

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

constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);
timeScope = timescope('YLimits',[0 40],'SampleRate',fs,'TimeSpanSource','property','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.1761

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

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

Оценка вполне близко к заданному ОСШ 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.5812

Вычислите MER.

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

ОСШ (≈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

Примените амплитуду и разбаланс фазы к модулируемому сигналу с помощью iqimbal функция.

ampImb = 3;
phImb = 10;
rxSig = iqimbal(modSig,ampImb,phImb);

Постройте полученное созвездие.

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;
y = iqimbal(x,ampImb,phImb);

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

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.2675

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

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

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 = timescope('YLimits',[0 40],'SampleRate',fs,'TimeSpanSource','property','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.7174

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

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

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

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

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

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power','AveragingDimensions',2);
timeScope = timescope('YLimits',[0 40],'SampleRate',fs,'TimeSpanSource','property','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);
iqImbalSig = iqimbal(rxSig,ampImb,phImb);
pnoiseSig = pnoise(iqImbalSig);
rxfiltOut = rxfilter(pnoiseSig);
constDiagram(rxfiltOut)

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

evmTime = evm(rxfiltOut);
timeScope(evmTime)

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

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

Оцените ОСШ.

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

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

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

|

Для просмотра документации необходимо авторизоваться на сайте