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?
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.
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
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
Pozdrawiam