Ну в том-то и дело, что вычисляю все возможные значения корреляционного интеграла от 2х последовательностей (с помощью fft, свертки, и обратного fft) на интервале, равном периоду последовательности.
Тем самым я должен оценить значение сдвига принимаемой и генерируемой последовательности - т.е. какое-то из этих значений нормированного корреляционного интеграл должно быть близко к единице, если принятый сигнал содержит эту же последовательность.
В данном случае, видимо, из-за шума, все значения корреляционной функции очень близки к нулю. Причем без разницы - отфильтровываю ли я значения I и Q или нет - значения корреляционной функции незначительно отличаются при этом. Вот в том и проблема.
Сама реализация корреляции через БПФ правильна - ну тут и не может быть ошибок, три действия...Тем более, что проверялось... Вод код.
Код
clear;
load('signal.mat'); %загружаем сигнал
load('gold.mat'); %загружаем последовательность
fc = 4.092e6; %частота несущей
fs = 10*4.092e6; %частота дискретизации
ts = 1/fs; %время сэмпла
n = fs/1000; %количество сэмплов в одной миллисекунде
nn = [0:n-1]; %номера отсчетов дискр. времени
S = [S(1:n)]; %первая миллисекунда сигнала
expfreq=exp(j*2*pi*fc*ts*nn);
sine = imag(expfreq);
cosine = real(expfreq);
I = cosine.*S;
Q = sine.*S;
%здесь была фильтрация
IQfreq = fft(I+j*Q);
codefreq = conj(fft(G0));
convcodeIQ = IQfreq.*codefreq';
result = abs(ifft(convcodeIQ))/n;
[peak codephase]=max(result)
codephaseChips = round(1023 - (codephase/40920)*1023)
Сейчас еще нарыл схему (в аттаче). Судя по ней - все верно, в общем-то. Значит проблема все же в фильтрации. До раздела про дискретные фильтры, в общем-то еще не добрался (ЦОС изучаю-то дня три всего)... Если кто подскажет, какой фильтр лучше использовать для этих целей, буду рад. Фильтры вроде фильтров Баттерворта и Чебышева, как я понял, нецелесообразно использовать из-за плохих фазовых, а соответственно и временных характеристик. А дискретного фильтра Бесселя, как я понял, не существует...