Примените различные нарушения РФ к сигналу 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.
Примените амплитуду и разбаланс фазы к модулируемому сигналу.
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 дБ, что означает, что эффекты других нарушений являются значительными и ухудшат производительность частоты ошибок по битам.