logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Matlab] m-QAM, m-PSK symulator

podolski.p 01 Lis 2011 14:21 1416 0
REKLAMA
  • #1 10089234
    podolski.p
    Poziom 10  
    Witam serdecznie,
    Po paru dniach wprowadzenia siebie w tematy modulacji cyfrowych i środowiska Matlab zacząłem pracę nad projektem inżynierskim.
    Pracę zacząłem od modulatora QPSK (heh, tak mi się wydaje), lecz jak to zawsze bywa u początkujących - pojawiły się problemy.
    Mianowicie, pytania:
    1)..
    2) Jak wyświetlić konstelację danego sygnału wyjściowego?
    Poza tym, będę oczywiście wdzięczny za wszystkie wskazówki, porady i wskazane błędy.
    edit: Odpowiedź na pierwsze pytanie znaleziona.
    Co do drugiego, konstelacja którą wyświetlam poleceniem scatterplot(j*.Q+I), wygląda co najmniej dziwnie. Czym to może być spowodowane?
    
    clear all
    datastream = randint(1, 250);
    %qpsk grey's mapping
    %10 | 00
    %11 | 11
    
    M = 4;          %modulation valence
    v = log2(4);    %bits per symbol
    
    fc = 500;       %carrier's frequency
    fs = 15000;     %sampling frequency
        
    T=1/fc;                                 %period time
    number = length(datastream)/M;        %amount of carier periods
    t = 0:1/fs:T*number;                   %time vector
    
    %split the data for a even and odd stream (QPSK, 4QAM);
    
    n=1;
    m=1;
    i=1;
    
    odd = zeros(length(datastream)/2,v);        %memory allocation
    even = zeros(length(datastream)/2,v);       %memory allocation
    
    for k=1:length(datastream)/M
        for j=1:2
            if (i<=length(datastream))
                odd(m,j) = datastream(1, i);
                i=i+1;
            end
        end
        m=m+1;
        for j=1:2
            if (i<=length(datastream))
                even(n,j) = datastream(1, i);
                i=i+1;
            end
        end
        n=n+1;
    end
    
    %generate carrier
    clear j;
    IF = cos(2*pi*fc*t);
    QD = cos(2*pi*fc*t+pi/2);
    
    odd_level = zeros(1, length(odd));
    even_level = zeros(1, length(even));
    
    %level generator
    for i=1:length(odd)
            if odd(i, 1) == 0
                if odd(i, 2) == 0
                    odd_level(i) = 3;
                end
            end
            if odd(i, 1) == 0
                if odd(i, 2) == 1
                    odd_level(i) = 1;
                end
            end
            if odd(i, 1) == 1
                if odd(i, 2) == 1
                   odd_level(i) = -1;
                end
            end
            if odd(i, 1) == 1
                if odd(i, 2) == 0
                    odd_level(i) = -3;
                end
            end
    end
    
    %level generator
    for i=1:length(even)
            if even(i, 1) == 0
                if even(i, 2) == 0
                    even_level(i) = 3;
                end
            end
            if even(i, 1) == 0
                if even(i, 2) == 1
                    even_level(i) = 1;
                end
            end
            if even(i, 1) == 1
                if even(i, 2) == 1
                    even_level(i) = -1;
                end
            end
            if even(i, 1) == 1
                if even(i, 2) == 0
                    even_level(i) = -3;
                end
            end
    end
    
    j=1;
    in_phase = zeros(1, length(t));
    
    %Multiply by carrier
    for i=1:length(odd_level)
        for j=j:j+length(t)/length(odd_level)
            in_phase(1, j) = odd_level(1, i);
        end
    end
    
    quadrature = zeros(1, length(t));
    j=1;
    
    for i=1:length(even_level)
        for j=j:j+length(t)/length(even_level)
            quadrature(1, j) = even_level(1, i);
        end
    end
    
    I = IF.*in_phase;
    Q = QD.*quadrature;
    
    Y = Q+I;
    y = awgn(Y, 30);
    
    
    subplot(7, 1, 1), plot(t, IF)
    subplot(7, 1, 2), plot(t, in_phase)
    subplot(7, 1, 3), plot(t, I)
    subplot(7, 1, 4), plot(t, QD)
    subplot(7, 1, 5), plot(t, quadrature)
    subplot(7, 1, 6), plot(t, Q)
    subplot(7, 1, 7), plot(t, y)
    

    Mam nadzieję, że dobrze trafiłem z kategorią. Jeżeli nie - serdecznie przepraszam.
    Dziękuję i pozdrawiam

    Dodano po 3 [godziny] 57 [minuty]:

    Znalazłem następny błąd. Wydaje mi, się coś co zaprezentowałem u góry jest czymś w rodzaju 16-qam więc faktycznie poprawiłem to na QPSK.
    
    clear all
    data_stream = randi(2,1, 50);
    data_stream = data_stream-1;
    
    %qpsk grey's mapping
    %10 | 00
    %11 | 11
    
    M = 4;          %modulation's valence
    v = log2(M);    %bits per symbol
    
    count_by = v/2; 
    
    fc = 500;       %carrier's frequency
    fs = 15000;     %sampling frequency
    
    T=1/fc;                                %period time
    number = length(data_stream)/v;         %amount of carier periods
    t = 0:1/fs:T*number;                   %time vector
    
    %split the data for a even and odd stream (QPSK, 4QAM);
    
    odd_data = zeros(length(data_stream)/v,count_by);   %memory allocation
    even_data = zeros(length(data_stream)/v,count_by);  %memory allocation
    
    row_1 = 1;
    row_2 = 1;
    k = 1;
    
    for n=1:length(data_stream)/v
        if (k <= length(data_stream))
            for l=1:count_by
                odd_data(row_1, l) = data_stream(1, k);
                k=k+1;
            end
            row_1 = row_1+1;
        end
        if (k <= length(data_stream))
            for l=1:count_by
                even_data(row_2, l) = data_stream(1, k);
                k=k+1;
            end
            row_2 = row_2+1;
        end
    end
    
    odd_level = zeros(1, length(odd_data));      %memory allocation
    even_level = zeros(1, length(even_data));    %memory allocation
    
    %generate levels, out: saw-shaped signal
    for n=1:length(data_stream)/v
            if odd_data(n, l) == 0
                odd_level(1, n) = -1;
            end
            if odd_data(n, l) == 1
                odd_level(1, n) = 1;
            end
            if even_data(n, l) == 0
                even_level(1, n) = -1;
            end
            if even_data(n, l) == 1
                even_level(1, n) = 1;
            end
    end
    
    %generate carriers
    IF = 1.41*cos(2*pi*fc*t);
    QD = 1.41*cos(2*pi*fc*t+pi/2);
    
    in_phase = zeros(1, length(t));         %memory allocation
    quadrature = zeros(1, length(t));       %memory allocation
    
    %Multiply by carrier
    j=1;
    for i=1:length(odd_level)
        for j=j:j+(length(t)/length(odd_level))
            in_phase(1, j) = odd_level(1, i);
        end
    end
    
    j=1;
    for i=1:length(even_level)
        for j=j:j+(length(t)/length(even_level))
            quadrature(1, j) = even_level(1, i);
        end
    end
    clear j;
    
    I = IF.*in_phase;
    Q = QD.*quadrature;
    
    scatterplot(I.*j+Q)
    

    Konstelacja pokazuje rzeczywiście jeden poziom energetyczny, lecz ... nie tak jak powinna. Dlaczego? Do tego jeszcze nie doszedłem ;) Czy podejście które prezentuję powyżej jest prawidłowe?
    Pozdrawiam
  • REKLAMA
REKLAMA