スター 16 QAM 変調器と復調器の設計の matlab コードが必要です
コードの作り方を教えてください。以下に、コンスタレーション ダイアグラムの例を示します。この星座のコードを異なるリング半径で作成したいと考えています。
スター 16 QAM 変調器と復調器の設計の matlab コードが必要です
コードの作り方を教えてください。以下に、コンスタレーション ダイアグラムの例を示します。この星座のコードを異なるリング半径で作成したいと考えています。
これは、グレー マッピングを使用して Star-16-QAM マッピングを行い、AWGN チャネルをモデル化し、決定とデマッピングを行う Matlab スクリプトの例です。ビット誤り率 (BER) も計算されます。その仕組みを簡単に説明します。
まず、「0」と「1」が同じ確率で発生するランダムなビット シーケンスを作成します。コンスタレーション ダイアグラムの内側と外側の円の半径も定義されます。
% Random bit sequence
numberOfBits = 1e5;
x = rand(1, numberOfBits);
x( x < 0.5 ) = 0;
x( x >= 0.5 ) = 1;
% Radius of inner and outer circle
r1 = 1;
r2 = 2;
次のステップでは、整数のインデックス番号を複雑なシンボルにマップするマッピング テーブルを定義します。これは、隣接する 2 つのシンボルが 1 ビットだけ異なるように行われます。これはグレイ マッピングと呼ばれます。
% Define mapping table applying Gray mapping
mappingTable(1) = r1 * exp(1i* 0);
mappingTable(2) = r1 * exp(1i* pi/4);
mappingTable(3) = r1 * exp(1i* 3*pi/4);
mappingTable(4) = r1 * exp(1i* pi/2);
mappingTable(5) = r1 * exp(1i* 7*pi/4);
mappingTable(6) = r1 * exp(1i* 3*pi/2);
mappingTable(7) = r1 * exp(1i* pi);
mappingTable(8) = r1 * exp(1i* 5*pi/4);
mappingTable(9:16) = mappingTable(1:8) ./ r1 .* r2;
次に、4 ビットのブロックごとにシンボル インデックスを計算し、対応する複雑なシンボルをマッピング テーブルで検索します。
if mod(numberOfBits, 4) ~= 0
error('numberOfBits must be a multiple of 4.');
end
mappedSymbols = zeros(1, numberOfBits / 4);
% Map bits to symbols
for i = 1:4:length(x)
symbolBits = x(i:i+3);
symbolIndex = 2^3 * symbolBits(1) + 2^2 * symbolBits(2) + 2^1 * symbolBits(3) + 2^0 * symbolBits(4);
% Mapping
mappedSymbols((i - 1)/4 + 1) = mappingTable( symbolIndex + 1);
end
実際の通信システムでは、複素シンボルの実数部と虚数部がアナログ信号に変換され (インパルス シェーパーを使用)、無線周波数キャリアに変調されます。ここでは、D/A と A/D 変換、および変調と復調が理想的であると仮定しているため、モデル化する必要はありません。さらに、チャネルは理想的、つまり周波数領域で平坦であると想定されます。ただし、ホワイト ガウス ノイズを追加してノイズを考慮します。ノイズ パワーは、信号の実数部と虚数部に均等に分布していることに注意してください。
% Add white Gaussian noise
snr = 20; % signal-to-noise ratio in dB
meanSignalPower = (r1^2 + r2^2)/2;
snr_lin = 10^(snr/10); % linear scale
meanNoisePower = meanSignalPower ./ snr_lin;
receivedSignal = mappedSymbols + randn(1, length(mappedSymbols)) * sqrt(meanNoisePower/2) +...
1i * randn(1, length(mappedSymbols)) * sqrt(meanNoisePower/2);
最後に、受信したシンボルごとに、最小距離のコンスタレーション ポイントを決定し、シンボル インデックスをビット シーケンスに変換します。
% Decision and demapping
receivedBits = zeros(1, numberOfBits / 4);
for i = 1:length(receivedSignal)
[mindiff minIndex] = min(receivedSignal(i) - mappingTable);
symbolIndex = minIndex - 1;
bitString = dec2bin(symbolIndex, 4);
receivedBits((i-1)*4 + 1) = str2double(bitString(1));
receivedBits((i-1)*4 + 2) = str2double(bitString(2));
receivedBits((i-1)*4 + 3) = str2double(bitString(3));
receivedBits((i-1)*4 + 4) = str2double(bitString(4));
end
もちろん、ビット エラーの数に関心があります。
numberOfBitErrors = nnz( x - receivedBits );
ber = numberOfBitErrors / numberOfBits; % bit error rate
disp(['SNR: ' num2str(snr) ' dB']);
disp(['Bit error rate (BER): ' num2str(ber)]);
送信信号と受信信号をプロットすると、典型的なコンスタレーション ダイアグラムが得られます。
figure;
plot( real(receivedSignal), imag(receivedSignal), '.'); hold on;
absLim = max( max(real(receivedSignal)), max(imag(receivedSignal)));
xyLimits = [-absLim*1.1 absLim*1.1];
xlim( xyLimits );
ylim( xyLimits );
plot( real(mappedSymbols), imag(mappedSymbols), '.r'); hold off;
xlim( xyLimits );
ylim( xyLimits );
xlabel('real part');
ylabel('imaginary part');
legend('received', 'transmitted');
完全なソース コードをまとめてアップロードしました: http://pastebin.com/MDcVLZhh