【无线通信】OQPSK

调制

comm.OQPSKModulator

%   PhaseOffset           - Phase of zeroth point of constellation
%   BitInput              - Assume bit inputs
%   SymbolMapping         - Constellation encoding
%   PulseShape            - Pulse shape type
%   RolloffFactor         - Rolloff factor for raised cosine pulse shapes
%   FilterSpanInSymbols   - Filter span (in symbols) for raised cosine pulse shapes
%   FilterNumerator       - Custom FIR filter coefficients
%   SamplesPerSymbol      - Samples per symbol
%   OutputDataType        - Data type of output

O-QPSK modulation (part 1)

Gray、OQPSK

  % mapping:
  %  1 | 0        01 | 00
  % ---+---   => ----+----
  %  3 | 2        11 | 10
symbols = bits*2 - 1;
re = -symbols(2:2:end);
im = -symbols(1:2:end);

Filtering:Root raised cosine


obj.pFilter = comm.RaisedCosineTransmitFilter('Shape', 'Square root', ...
  'RolloffFactor', obj.RolloffFactor, 'FilterSpanInSymbols', obj.FilterSpanInSymbols, ...
  'OutputSamplesPerSymbol', sps, 'Gain', sqrt(sps/2));
filtered = obj.pFilter([re im]);
filteredRe = filtered(:, 1);
filteredIm = filtered(:, 2);

O-QPSK modulation (part 2)

初始化,半个周期的码元

obj.pPrevHalfSymbol = zeros(obj.SamplesPerSymbol/2, 1, obj.OutputDataType);

delay Q component

filteredAligned   = [obj.pPrevHalfSymbol; filteredIm(1:end-obj.SamplesPerSymbol/2)];
obj.pPrevHalfSymbol = filteredIm(end-obj.SamplesPerSymbol/2+1 : end);
oqpskWaveform       = complex(filteredRe, filteredAligned);

输出波形,移相

oqpskWaveform = oqpskWaveform * exp(1i*obj.PhaseOffset);

解调

comm.OQPSKModulator

%   PhaseOffset           - Phase of zeroth point of constellation from pi/4
%   BitOutput             - Output data as bits
%   SymbolMapping         - Constellation encoding
%   PulseShape            - Pulse shape type
%   RolloffFactor         - Rolloff factor for raised cosine pulse shapes
%   FilterSpanInSymbols   - Filter span (in symbols) for raised cosine pulse shapes
%   FilterNumerator       - Custom FIR filter coefficients
%   SamplesPerSymbol      - Samples per symbol
%   OutputDataType        - Data type of output

初始化

obj.pPrevHalfSymbol = zeros(sps/2, 1);
obj.pMapping = [1 3 0 2]; 

滤波器

case 'Normal raised cosine'
  obj.pFilter = comm.RaisedCosineReceiveFilter('Shape', 'Normal', ...
    'RolloffFactor', obj.RolloffFactor, 'FilterSpanInSymbols', obj.FilterSpanInSymbols, ...
    'InputSamplesPerSymbol', sps, 'DecimationFactor', sps, 'DecimationOffset', sps/2, 'Gain', sqrt(sps/2));
  
case 'Root raised cosine'
  obj.pFilter = comm.RaisedCosineReceiveFilter('Shape', 'Square root', ...
    'RolloffFactor', obj.RolloffFactor, 'FilterSpanInSymbols', obj.FilterSpanInSymbols, ...
    'InputSamplesPerSymbol', sps, 'DecimationFactor', sps, 'DecimationOffset', sps/2, 'Gain', sqrt(sps/2));

去除移相

oqpskWaveform = double(input);
oqpskWaveform = oqpskWaveform * exp(-1i*obj.PhaseOffset);

对齐IQ

aligned = complex(...
 [obj.pPrevHalfSymbol; real(oqpskWaveform(1:end-obj.SamplesPerSymbol/2))], ...
 imag(oqpskWaveform)...
 );
 
obj.pPrevHalfSymbol = real(oqpskWaveform(end-obj.SamplesPerSymbol/2+1 : end));

滤波器,下采样1

% Filter and decimate to 1 (QPSK) sample per symbol
filtered = obj.pFilter(aligned);

QPSK解调

demodulated = qamdemod(filtered, 4, obj.pMapping);

系统仿真

sps = 4; % samples per symbol

modulator = comm.OQPSKModulator( ...
    'BitInput',true, ...
    'SymbolMapping','Gray',...
    'SamplesPerSymbol',sps, ...
    'PulseShape','Root raised cosine',...
    'RolloffFactor',0.5);
demodulator = comm.OQPSKDemodulator(modulator);
bits = randi([0, 1], 224*8, 1); % 1792
oqpskWaveform = modulator(bits); % 3584 : 1792/log2(M) * sps
snr = 7;
rxWaveform = awgn(oqpskWaveform,snr);
demodData = demodulator(rxWaveform);
delay = (1+modulator.BitInput)*modulator.FilterSpanInSymbols; % 20
[~, ber] = biterr(bits(1:end-delay), demodData(delay+1:end))
% 绘制相位图
plot(unwrap(angle(oqpskWaveform)))

在这里插入图片描述

% 绘制IQ图
plot(1:length(oqpskWaveform),real(oqpskWaveform),1:length(oqpskWaveform),imag(oqpskWaveform))

在这里插入图片描述

plot(abs(fftshift(fft(oqpskWaveform))))

在这里插入图片描述

相关推荐

  1. 通信行业无线基本概念

    2024-04-23 19:04:05       54 阅读
  2. 无线通信:多址(Multiple Access)方式

    2024-04-23 19:04:05       48 阅读
  3. 商用无线通信:信道带宽

    2024-04-23 19:04:05       32 阅读
  4. 【东枫科技 招聘】实习:无线通信工程

    2024-04-23 19:04:05       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 19:04:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 19:04:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 19:04:05       82 阅读
  4. Python语言-面向对象

    2024-04-23 19:04:05       91 阅读

热门阅读

  1. 程序员缓解工作压力的小窍门

    2024-04-23 19:04:05       35 阅读
  2. Python基础学习之itertools.zip_longest()函数

    2024-04-23 19:04:05       38 阅读
  3. 面试十四、内存泄漏

    2024-04-23 19:04:05       34 阅读
  4. 【Linux】学习记录_16_POSIX互斥锁

    2024-04-23 19:04:05       39 阅读
  5. VUE发展方向的文章

    2024-04-23 19:04:05       105 阅读
  6. CUDA编程:其四、CUDA矩阵乘法

    2024-04-23 19:04:05       35 阅读
  7. v-deep 打破作用域隔离的原理

    2024-04-23 19:04:05       37 阅读
  8. nginx的location

    2024-04-23 19:04:05       158 阅读
  9. Linux动静态库

    2024-04-23 19:04:05       33 阅读
  10. 在Linux上使用MySQL Yum存储库安装MySQL

    2024-04-23 19:04:05       36 阅读
  11. 【堆】Leetcode 295. 数据流的中位数【困难】

    2024-04-23 19:04:05       36 阅读