2016-04-26 7 views
0

レイリーフェージングとAWGNでCRCの効果をシミュレートしたい。次のように私のコードは次のとおりです。「ノイズの次元が合致しなければならない」チャンネルノイズ追加

clear 
NoBits =4; % number of bits 
noPacket=4; 

%-------------------------At the transmitter------------------------------- 

DataIn =randi([0,1],noPacket,NoBits); % generating 0,1 with equal probability 

%~~~~~~~~~~Cyclic Redundancy Check (CRC)~~~~~~~~~~ 
      div=[1 0 0 1];  % predetermined divisor 
      for i=1:noPacket 
       [q,r]=deconv(DataIn(i,:),div); 
       y(i,:)=[DataIn(i,:),zeros(1,3)]; 
       for k=1:NoBits 
         r(k)=mod(r(k),2); 
       end 
       fcs=[zeros(1,3),r];  % frame check sequence 
       DataOut(i,:)=bitxor(y(i,:),fcs); 
      end 

%~~~~~~~~~~BPSK Modulation~~~~~~~~~~ 

BPSK1 = 2*DataOut-1; % BPSK modulation 0 -> -1; 1 -> 0 

Eb_N0_dB = [-3:35]; % multiple Eb/N0 values 
%-------------------------Channel Modelling------------------------------- 

for ii = 1:length(Eb_N0_dB) 

    awgn = 1/sqrt(2)*[randn(1,NoBits) + j*randn(1,NoBits)]; % white gaussian noise, 0dB variance 
    Ray = 1/sqrt(2)*[randn(1,NoBits) + j*randn(1,NoBits)]; % Rayleigh channel 

% Channel and noise Noise addition 
y = Ray.*BPSK1 + 10^(-Eb_N0_dB(ii)/20)*awgn; 

%----------------------------At the Receiver------------------------------- 
     % equalization 
     yHat = y./Ray; 
    % receiver - hard decision decoding 
    recDat = real(yHat)>0; 

    % counting the errors 
    nErr(ii) = size(find([DataIn-recDat]),2); 

end 

simBer = nErr/NoBits; % simulated ber 
theoryBerAWGN = 0.5*erfc(sqrt(10.^(Eb_N0_dB/10))); % theoretical ber 
EbN0Lin = 10.^(Eb_N0_dB/10); 
theoryBer = 0.5.*(1-sqrt(EbN0Lin./(EbN0Lin+1))); 

% plot 
close all 
figure 
semilogy(Eb_N0_dB,theoryBerAWGN,'cd-','LineWidth',2); 
hold on 
semilogy(Eb_N0_dB,theoryBer,'bp-','LineWidth',2); 
semilogy(Eb_N0_dB,simBer,'mx-','LineWidth',2); 
axis([-3 35 10^-5 0.5]) 
grid on 
legend('AWGN-Theory','Rayleigh-Theory', 'Rayleigh-Simulation'); 
xlabel('Eb/No, dB'); 
ylabel('Bit Error Rate'); 
title('BER for BPSK modulation in Rayleigh channel'); 

私はエラー得ている行に「使用してエラーを* .Matrix寸法が同意しなければなりません。」:

y = Ray.*BPSK1 + 10^(-Eb_N0_dB(ii)/20)*awgn; 

誰も私がこれを解決するのに役立ちます願っています。

+0

1x4ベクトルと4x7行列の間で要素の賢明な乗算を実行しようとしています。 – ritualmagick

答えて

2

element-wiseとMATLABのmatrix operationsを完全に理解しているとは思いません。

各操作の前にドットが付いている最初の例は、.*./.^などです。操作を要素ごとに行うことを意味します。したがって、オペレータの各側に行列が正確に同じ大きされている必要があります。

A = [1 2; 3 4]; B = [4 5; 6 7]; 
A .* B = [1*4 2*5; 3*6 4*7] = [4 10; 18 28] 

他のタイプを、行列演算は、行列上で動作:

A * B = [1*4+2*6 1*5+2*7; 3*4+4*6 3*6+4*7] = [16 19; 36 46] 

行列演算は、行列に行うことができます異なるサイズは、限り、寸法が一致するよう:あなたは、あなたが要素ごとの乗算をやっているRay.*BPSK1を行うと

A = [1 2; 3 4]; B = [4; 6]; 
A * B = [1*4 + 2*6; 3*4+4*6] = [16; 36] 

、これの行列でなければなりませんO同じサイズ。それはあなたがここに達成したい内容を正確に把握するのは難しいですが、次元のミスマッチを回避し、いくつかの選択肢があります:


Ray*BPSK1 

これは動作しますが、追加しようとすると、あなたの次元の不一致を与えます上記の式の結果は、寸法が[1x7]であり、awgnは、寸法が[1x4]であるため、次の用語になります。


BPSK1.'*Ray.' 

これは動作しますが、寸法[7x1]との結果が得られます。したがって、上記と同じ問題が発生します。


bsxfun(@times, BPSK1, Ray.') 

これは動作しますが、あなたに新しい不一致の問題を与えるので、あなたに[7x4]配列を与えるだろう。

関連する問題