Код: Выделить всё
clear all
close all
lenDataSym = 100;%Число символов для модуляции
M = 2;%Порядок модуляции
Fs = 600000*4;%Частота дискретизации
symbRate = 600000;%Символьная скорость
samplePerSymb = Fs/symbRate;%Число отсчетов на символ
indexMod = 1;%Индекс модуляции
freqSep = indexMod*symbRate;%Расстояние между частотами модуляции
timeOffset = 1/4;
samplesOffset = timeOffset*samplePerSymb;%Временная отстройка выраженная в отсчетах
EbN0 = [7:0.25:12];
ber = zeros(1,length(EbN0));
for i=1:1:length(EbN0)
numerr = 0;
numbit = 0;
for numExp=1:2000
data = randsrc(1,lenDataSym, [0 1; 0.5 0.5]);%Генерация битового потока
dataSymb = bi2de(reshape(data,log2(M),[])','left-msb');%Перевод битового потока в символы
modSignal = fskmod(dataSymb,M,freqSep,samplePerSymb,Fs,'cont','gray');%fsk модулятор
recvSignal = awgn(modSignal,EbN0(i) - 10*log10(samplePerSymb) + 10*log10(log2(M)),'measured');%Добавление шума
recvSignal = recvSignal(samplesOffset+1:end-(samplePerSymb-samplesOffset));%Имитация временной отстройки
demodData = fskDemod(recvSignal,M,Fs,freqSep,samplePerSymb);%демодуляция
demodData = de2bi(demodData,'left-msb')';
demodData = demodData(:)';
numerr = numerr + sum(xor(demodData(1:end),data(1:end-1)));
numbit = numbit + length(data);
end
ber(i) = ber(i) + numerr/numbit;
% sprintf('ber = %d; Ebn0 = %d', ber(i), EbN0(i))
end
semilogy(EbN0,ber,'-*')
hold on
grid on
Имитацию временной отстройки моделирую следующим образом: отрезаю от начала сигнала несколько отсчетов. Таким образом я моделирую ситуацию, когда начало символа смещено на несколько отсчетов. В конце сигнала я отрезаю еще несколько отсчетов, чтобы в итоге длительность сигнала была кратна числу отсчетов на символ.
Демодулятор использую свой, код привожу ниже:
Код: Выделить всё
function [dataOut] = fskDemod(dataIn, M, Fs, freqSep, samplePerSymb)
dataOut = zeros(floor(length(dataIn)/samplePerSymb),1);
freqs = [-(M-1)/2:1:(M-1)/2]*freqSep;
mapGray = gray2bin([0:M-1],'fsk',M);
freqsGray = zeros(1,length(freqs));
for i=1:length(freqs)
freqsGray(i) = freqs(mapGray(i)+1);
end
t = [0:1:samplePerSymb-1]/Fs;
refSignals = zeros(M,samplePerSymb);
for i=1:1:M
refSignals(i,:) = exp(-1i*2*pi*t*freqsGray(i));
end
scalProd = zeros(1,M);
dataIn = reshape(dataIn,samplePerSymb,[])';
for i=1:1:length(dataOut)
for j=1:1:length(scalProd)
scalProd(j) = dot(dataIn(i,:),refSignals(j,:));
end
[~, ind] = max(scalProd);
dataOut(i) = ind-1;
end
end
График BER в ситуации, когда временная отстройка равна нулю, (то есть когда я не отрезаю ничего от начала символа) совпадает с теоретической кривой, которую я получил из среды bertool.
После чего я строю график BER для ситуации, когда имеется отстройка в один отсчет (то есть, когда я отрезаю от начала сигнала один отсчет). При 4 отсчетах на символ, это соответствует отстройке равной 0,25 от длительности символа. График BER остался таким же. Как такое может быть? Ведь теперь, в демодуляторе при расчете скалярных произведений используется три отсчета от одного символа и один от другого, и по идее BER должен стать хуже.
Также, если я увеличиваю частоту дискретизации, чтобы увеличить число отсчетов на символ, например до 8 отсчетов на символ, и тоже отрезаю от начала символа 2 отсчета, чтобы величина отстройки также равнялась 0,25 от длительности символа, то BER ухудшается. Получается, что на BER влияет количество отсчетов на символ? Но ведь такого не должно быть.
Заранее спасибо за помощь.