comm.SampleRateOffset

Примените смещение частоты дискретизации к сигналу

Описание

comm.SampleRateOffset Система object™ применяет смещение частоты дискретизации к входному сигналу. Применение смещения частоты дискретизации эквивалентно изменению тактовой частоты ADC.

Применять смещение частоты дискретизации к сигналу:

  1. Создайте comm.SampleRateOffset объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?

Создание

Описание

sro = comm.SampleRateOffset создает Системный объект смещения частоты дискретизации.

пример

sro = comm.SampleRateOffset(offset) устанавливает Offset свойство к значению offset входной параметр.

sro = comm.SampleRateOffset(Offset=offset) устанавливает Offset свойство к значению задано offset.

Свойства

развернуть все

Смещение частоты дискретизации в частях на миллион (ppm) в виде скаляра, больше, чем –1e6.

Типы данных: double

Использование

Синтаксис

Описание

пример

y = sro(x) применяет смещение частоты дискретизации, сконфигурированное sro к входному сигналу и возвращает получившийся сигнал.

Входные параметры

развернуть все

Входной сигнал в виде скаляра, N S вектор-столбец элемента или матрица S-by-NC N. N S является количеством выборок времени. N C является количеством каналов. Для матричных входных сигналов смещение частоты дискретизации применяется независимо к каждому столбцу.

Типы данных: double | single
Поддержка комплексного числа: Да

Выходные аргументы

развернуть все

Выходной сигнал, возвращенный как скаляр или матрица с той же размерностью и типом данных как входной сигнал x.

Функции объекта

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

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

Установите параметры и входной сигнал.

M = 16;                    % Modulation order
offset = 50;               % Parts per million
data = (0:M-1)';           % Input signal
refconst = qammod(data,M); % Reference constellation points

Создайте смещение частоты дискретизации, и созвездие схематически изображают Системные объекты.

sro = comm.SampleRateOffset(offset);
constdiagram = comm.ConstellationDiagram( ...
    'ReferenceConstellation',refconst, ...
    'XLimits',[-5 5], ...
    'YLimits',[-5 5], ...
    'Title','Signal with Offset Sample Rate');

Примените 16-QAM модуляцию к случайным данным, и затем примените смещение частоты дискретизации к модулируемому сигналу. Постройте ссылочное созвездие и сигнал со смещением частоты дискретизации смещения.

modData = qammod(repmat(data,100,1),M);
impairedData = sro(modData);
constdiagram(impairedData)

Примените смещения частоты дискретизации к одной тональной синусоиде на 30 кГц. Подтвердите смещение путем вычисления различия в частоте между переданным тоном и полученным тоном после применения положительных и отрицательных смещений частоты дискретизации.

Сгенерируйте один тон на уровне 30 кГц.

f = 30e3;
samplerate = 100e3;
src = dsp.SineWave('Frequency',f, ...
    'SampleRate',samplerate, ...
    'SamplesPerFrame',10000, ...
    'ComplexOutput',true);
txsig = src();

Проверьте частоту тона.

freqtx = samplerate * ...
    (mean(angle(txsig(2:end) ./ txsig(1:end-1)))/(2*pi))
freqtx = 3.0000e+04

Примените смещение частоты дискретизации 20 страниц в минуту к тону передачи (txsig). Увеличение смещения частоты дискретизации эквивалентно увеличению тактовой частоты ADC.

sro = comm.SampleRateOffset(20);
rxsig = sro(txsig);

Найдите частоту полученного тона (rxsig) после возмещения частоты дискретизации. Чтобы пропустить выборки с переходными эффектами, проигнорируйте первые 100 выборок.

freqrx = samplerate * ...
    (mean(angle(rxsig(101:end) ./ rxsig(100:end-1)))/(2*pi))
freqrx = 2.9999e+04

При увеличении тактовой частоты ADC, уменьшает частоту полученного тона. Чтобы показать что частота полученных тональных уменьшений приблизительно на 20 страниц в минуту, сравните частоту переданного тона к частоте полученного тона.

freqchangeppm = (freqrx-freqtx)/freqtx*1e6
freqchangeppm = -19.9365

Примените смещение частоты дискретизации-30 страниц в минуту к тону передачи (txsig). Уменьшение смещения частоты дискретизации эквивалентно уменьшению тактовой частоты ADC.

sro = comm.SampleRateOffset(-30);
rxsig = sro(txsig);

Найдите частоту полученного тона (rxsig) после возмещения частоты дискретизации. Чтобы пропустить выборки с переходными эффектами, проигнорируйте первые 100 выборок.

freqrx = samplerate * ...
    (mean(angle(rxsig(101:end) ./ rxsig(100:end-1)))/(2*pi))
freqrx = 3.0001e+04

При уменьшении тактовой частоты ADC, увеличивает частоту полученного тона. Чтобы показать что частота полученных тональных увеличений приблизительно на 30 страниц в минуту, сравните частоту переданного тона к частоте полученного тона.

freqchangeppm = (freqrx-freqtx)/freqtx*1e6
freqchangeppm = 30.0736

Отобразите эффекты смещения частоты дискретизации в приемнике на сигнале QPSK.

Передайте кадры, содержащие фиксированную преамбулу и случайную полезную нагрузку. В приемнике используйте преамбулу, чтобы найти начало системы координат, и затем демодулировать полезную нагрузку и измерить EVM. С постоянным ненулевым смещением частоты дискретизации EVM варьируется от системы координат до системы координат с сопоставимой периодичностью.

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

numFrames = 200;
numSymbolsPerFrame = 4096;
preambleLength = 64;
payloadLength = numSymbolsPerFrame - preambleLength; 
modulationOrder = 4;

rolloff = 0.2;
filterSpan = 10;
samplesPerSymbol = 8;
txFilter = comm.RaisedCosineTransmitFilter(RolloffFactor=rolloff, ...
    FilterSpanInSymbols=filterSpan, ...
    OutputSamplesPerSymbol=samplesPerSymbol);
rxFilter = comm.RaisedCosineReceiveFilter(RolloffFactor=rolloff, ...
    FilterSpanInSymbols=filterSpan, ...
    InputSamplesPerSymbol=samplesPerSymbol,DecimationFactor=1);

Используйте последовательность Голда для преамбулы. Сопоставьте последовательность Голда с 0,7071 + 0.7071i и-0.7071 - 0.7071i в созвездии QPSK.

goldSeq = comm.GoldSequence(SamplesPerFrame=preambleLength);
preamble = goldSeq();
preamble(preamble==1)=2; 
preambleModOut = pskmod(preamble,modulationOrder,pi/modulationOrder);

Сгенерируйте опорный сигнал временного интервала для преамбулы.

preambleRefDelayed = rxFilter( ...
    txFilter([preambleModOut;zeros(filterSpan,1)]));
preambleRef = preambleRefDelayed( ...
    filterSpan*samplesPerSymbol+(1:samplesPerSymbol*preambleLength));

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

txPayload = pskmod( ...
    randi([0 modulationOrder-1],payloadLength,numFrames), ...
    modulationOrder, ...
    pi/modulationOrder);
txFrames = reshape([repmat(preambleModOut,1,numFrames);txPayload],[],1);
txSig = txFilter([txFrames;zeros(payloadLength,1)]);

Примените смещение частоты дискретизации на 0,8 страницы в минуту к полученному сигналу.

simulatedSRO = 0.8;
sro = comm.SampleRateOffset(simulatedSRO);
rxSig = rxFilter(sro(txSig));

Используйте согласованный фильтр, чтобы найти преамбулу.

matchedFilterResponse = conj(flipud(preambleRef));
matchedFilterOutMag = abs(filter(matchedFilterResponse,1,rxSig));

Найдите пиковые местоположения и постройте первые десять peaks.

threshold = max(matchedFilterOutMag)*0.7;
[~, peakLocations] = findpeaks(matchedFilterOutMag, ...
    MinPeakHeight=threshold, ...
    MinPeakDistance=preambleLength*samplesPerSymbol);
plot(matchedFilterOutMag)
title('Matched Filter Output (Magnitude)')
xlabel('Sample')
axis([0 numSymbolsPerFrame*samplesPerSymbol*10 ...
    -0.15*max(matchedFilterOutMag) 1.25*max(matchedFilterOutMag)]);
grid on

Figure contains an axes object. The axes object with title Matched Filter Output (Magnitude) contains an object of type line.

Найдите системы координат и исследуйте принятые данные путем графического вывода вычисленного значения EVM и полученного сигнального созвездия. Оцените смещение частоты дискретизации. Для более точной оценки можно увеличить число переданных кадров.

frameDelay = peakLocations - length(preambleRef);
constDiag = comm.ConstellationDiagram(Title='Received Payload', ...
    Position=[20 70 600 600]);
evm = comm.EVM;
evmScope = timescope(TimeUnits='none',TimeSpan=length(frameDelay), ...
    YLabel='EVM (%)',YLimits=[0 15],TimeAxisLabels='none', ...
    Position=[650 120 800 500]);
for i = 1:length(frameDelay)
    rxFrame = rxSig(frameDelay(i) + ...
        (1:samplesPerSymbol:numSymbolsPerFrame*samplesPerSymbol));
    evmScope(evm(txPayload(:,i),rxFrame(preambleLength+1:end)));
    constDiag(rxFrame(preambleLength+1:end));
    pause(0.1)
end

peakSpacings = diff(peakLocations);
nominalPeakSpacing = numSymbolsPerFrame*samplesPerSymbol;
estimatedSRO = (mean(peakSpacings)/nominalPeakSpacing-1)*1e6
estimatedSRO = 0.7668

Расширенные возможности

Введенный в R2021b