Этот пример расширяет Исследование 16-QAM Используя пример MATLAB, чтобы выполнить формирование пульса, и поднятая фильтрация косинуса при помощи пары квадратного корня подняла косинус (RRC) фильтры. rcosdesign функция создает фильтры. Производительность BER может быть улучшена путем добавления прямого исправления ошибок (FEC) к линии связи. Чтобы добавить FEC в канал связи с примером фильтрации формы импульса, см. пример использования прямой коррекции ошибок в 16-QAM Signal.
В этом примере показано, как обрабатывать двоичный поток данных с использованием линии связи, которая состоит из модулятора основной полосы частот, канала, демодулятора и формирования импульсов, а также косинусной фильтрации. Пример отображает часть случайных данных на графике основы, отображает переданные и принятые сигналы на диаграммах созвездий и вычисляет частоту битовых ошибок (BER).
Определите параметры моделирования для схемы модуляции 16-QAM с фильтрацией по увеличенному косинусу и канала AWGN.
M = 16; % Modulation order k = log2(M); % Number of bits per symbol numBits = 3e5; % Number of bits to process sps = 4; % Number of samples per symbol (oversampling factor)
Установите параметры фильтра RRC.
filtlen = 10; % Filter length in symbols rolloff = 0.25; % Filter rolloff factor
Используйте rcosdesign для создания фильтра RRC.
rrcFilter = rcosdesign(rolloff,filtlen,sps);
Используйте FVTool для отображения импульсной характеристики фильтра RRC.
fvtool(rrcFilter,'Analysis','Impulse')

Используйте randi для формирования случайных двоичных данных. Установите rng до состояния по умолчанию или любого статического начального значения, так что в примере получаются повторяемые результаты.
rng default; % Use default random number generator dataIn = randi([0 1],numBits,1); % Generate vector of binary data
Преобразование входного вектора в матрицу 4-разрядных двоичных данных. Затем используйте bi2de для преобразования данных в целочисленные символы.
dataInMatrix = reshape(dataIn,length(dataIn)/k,k); % Reshape data into binary 4-tuples dataSymbolsIn = bi2de(dataInMatrix); % Convert to integers
Применить 16-QAM модуляцию с помощью qammod функция.
dataMod = qammod(dataSymbolsIn,M);
Используйте upfirdn функция повышения дискретизации сигнала на коэффициент избыточной дискретизации и применение фильтра RRC. upfirdn функция прокладывает повышающий дискретизированный сигнал с нулями в конце для промывки фильтра. Затем функция применяет фильтр.
txFiltSignal = upfirdn(dataMod,rrcFilter,sps,1);
Используя количество битов на символ (kи количество выборок на символ (sps), преобразовать отношение энергии на бит к спектральной плотности мощности шума (EbNo) к значению SNR для использования awgn функция.
EbNo = 10; snr = EbNo + 10*log10(k) - 10*log10(sps);
Пропустить отфильтрованный сигнал через канал AWGN.
rxSignal = awgn(txFiltSignal,snr,'measured');Используйте upfirdn функция на принятом сигнале для понижения дискретизации и фильтрации сигнала. Понижение дискретизации с использованием того же коэффициента избыточной дискретизации, который применяется для повышения дискретизации передаваемого сигнала. Фильтрация с использованием того же фильтра RRC, который применяется к переданному сигналу.
Каждая операция фильтрации задерживает сигнал на половину длины фильтра в символах, filtlen/2. Таким образом, полная задержка от фильтрации передачи и приема равна длине фильтра, filtlen. Для вычисления BER передаваемый и принимаемый сигналы должны иметь одинаковый размер, и необходимо учитывать задержку между передаваемым и принимаемым сигналом. Удалить первый filtlen символы в прореженном сигнале для учета совокупной задержки операций фильтрации передачи и приема. Удалить последнюю filtlen символы в прореженном сигнале, чтобы гарантировать, что количество выборок на выходе демодулятора совпадает с количеством выборок на входе модулятора.
rxFiltSignal = upfirdn(rxSignal,rrcFilter,1,sps); % Downsample and filter rxFiltSignal = rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay
Используйте qamdemod функция демодуляции принятого отфильтрованного сигнала.
dataSymbolsOut = qamdemod(rxFiltSignal,M);
Преобразование восстановленных целых символов в двоичные данные с помощью de2bi функция.
dataOutMatrix = de2bi(dataSymbolsOut,k);
dataOut = dataOutMatrix(:); % Return data in column vectorОпределите количество ошибок и соответствующий BER с помощью biterr функция.
[numErrors,ber] = biterr(dataIn,dataOut); fprintf('\nFor an EbNo setting of %3.1f dB, the bit error rate is %5.2e, based on %d errors.\n', ... EbNo,ber,numErrors)
For an EbNo setting of 10.0 dB, the bit error rate is 1.83e-03, based on 550 errors.
Чтобы визуализировать эффекты фильтра на диаграмме глаз, уменьшите настройку Eb/N0 и восстановите полученные данные. Визуализируя сигнал с высоким SNR без других эффектов многолучевого распространения, можно использовать диаграммы глаз для выделения уменьшения межсимвольных помех (ISI) на выходе для пары фильтров RRC формирования импульсов. Фильтр RRC не имеет нулевого ISI до тех пор, пока он не будет спарен со вторым фильтром RRC для формирования каскада фильтра с увеличенным косинусом.
EbNo = 20; snr = EbNo + 10*log10(k) - 10*log10(sps); rxSignal = awgn(txFiltSignal,snr,'measured'); rxFiltSignal = upfirdn(rxSignal,rrcFilter,1,sps); % Downsample and filter rxFiltSignal = rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay
Создайте очковую диаграмму для части отфильтрованного бесшумного сигнала, чтобы визуализировать эффект формирования импульса. Передаваемый сигнал имеет RRC-фильтрацию и показывает ISI как сужение глазного отверстия.
eyediagram(txFiltSignal(1:2000),sps*2);

Отображение глазной диаграммы сигнала после шума канала показывает сигнал с фильтрацией RRC и шумом. Уровень шума вызывает дальнейшее сужение глазного проема.
eyediagram(rxSignal(1:2000),sps*2);

Отображение глазной диаграммы сигнала после применения фильтрации приема показывает сигнал с фильтрацией приподнятого косинуса. Чем шире глазная диаграмма, тем меньше ISI сигнала с фильтрацией с повышенным косинусом по сравнению с сигналом с фильтрацией RRC.
eyediagram(rxFiltSignal(1:2000),2);

Создайте диаграмму созвездия принятого сигнала до и после фильтрации. Масштабировать принятый сигнал на квадратный корень из числа выборок на символ для нормализации уровней мощности передачи и приема.
scatplot = scatterplot(sqrt(sps)*... rxSignal(1:sps*5e3),... sps,0); hold on; scatterplot(rxFiltSignal(1:5e3),1,0,'bx',scatplot); title('Received Signal, Before and After Filtering'); legend('Before Filtering','After Filtering'); axis([-5 5 -5 5]); % Set axis ranges hold off;
