Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Корреляция
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
inviZ
Извиняюсь заранее за глупый вопрос. Опыта в данной сфере - ноль, но так вышло, что необходимо разобраться, и как можно быстрее...
В общем, суть такова - есть BPSK-модулированный сигнал с частотой несущей 4.092Mhz, c частотой дискретизации 40.92 Mhz.
Задача - вычислить корреляцию сигнала с генерируемой псевдошумовой последовательностью (необходимо для "поиска" сигнала).
Проблема в том, что не могу максимально точно отфильтровать постоянную составляющую из соответствующих квадратурных и синфазных составляющих.
Максимум, что у меня получилось - на скриншоте (прямоугольный сигнал - соответствующая последовательность, т.е. в данном случае корреляция должна быть максимальна, но на деле, естественно, этого не происходит, т.к. принятый сигнал искажен). Пробовал разные фильтры - все равно искажения довольно сильные.
jorikdima
Может я не особо врубаюсь, но корреляция - это вычисление корреляционного интеграла от 2 последовательностей - опорной и принятой. Вы его вычисляете? Причем тут фильтр и фильтрация постоянной составляющей?
inviZ
Ну в том-то и дело, что вычисляю все возможные значения корреляционного интеграла от 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)


Сейчас еще нарыл схему (в аттаче). Судя по ней - все верно, в общем-то. Значит проблема все же в фильтрации. До раздела про дискретные фильтры, в общем-то еще не добрался (ЦОС изучаю-то дня три всего)... Если кто подскажет, какой фильтр лучше использовать для этих целей, буду рад. Фильтры вроде фильтров Баттерворта и Чебышева, как я понял, нецелесообразно использовать из-за плохих фазовых, а соответственно и временных характеристик. А дискретного фильтра Бесселя, как я понял, не существует...
inviZ
UPD.
Скурил раздел учебника по ЦОС про корреляцию, кое что прояснил. Разобрался с корреляцией более-менее теоретически.
Попробовал вычислить корреляцию по традиционной формуле. Все получается нормально, даже на нефильтрованных данных дает результат, очень близкий к ожидаемой оценке.
Не знаю, что и сказать. Почему вычисление корреляции через БПФ и свертку не работает? Где я затупил?
AlexeyT
Камрад, судя по тексту программы (код Голда...), ты работаешь с GPS-сигналами (или я ошибаюсь)? Задачу поиска сигналов конкреных навигационных спутников я в свое время решил, но без преобразования Фурье, а просто временной корреляцией. Если интересно, могу прислать текст программы и оцифрованный файл с GPS-приемника.

Кстати, если не секрет, что у тебя за исходный файл? Каким оборудованием записан?
anton
Сейчас точно не помню но

codefreq = conj(fft(G0)); не нравится попробуй

codefreq = (fft(G0)); если не заработает переверни массив опорной функции codefreq = fft(rot90(rot90(G0)));
shasik
1. Точно не помню, но, по-моему, ifft уже нормирует результат на 1/n, поэтому еще раз делить не надо. Это может увеличит амплитуду пика корреляции.

2. Если в процедуре вычисления корреляции Вы абсолютно уверены, значит "сравниваете" разные сигналы. Например, берем N отсчетов двух одинаковых(по форме) сигналов, но у одного период T1, а у другого T2, т.е. сигналы вроде "одинаковые", а на самом деле разные. Проверьте свои сигналы S и G0, одинаковые ли они? Кстати, между делом, если T1=6, а T2=9, то необходимо вычислять корреляцию сигналов длиной 18.

Когда разгадаете эту тайну золотого ключика, расскажите...
Ghost2
Вот как вычислить ВКФ двух сигналов:

clear all;
close all;

N=512;
%например
signal1=sin((1:N)/(2*pi));
signal2=cos((1:N)/(2*pi+0.5));

corr=xcorr(signal1, signal2);%встроенная в матлаб функция

% то же самое, что и xcorr, только ручками
% результат в 2 раза длиннее исходных сигналов
spectr1=fft(signal1, 2*N);
spectr2=conj(fft(signal2, 2*N));

corr_my=real(ifft(spectr1.*spectr2));
corr_my=[corr_my(N+2:2*N) corr_my(1:N)];

figure(1);
plot(corr);

figure(2);
plot(corr_my);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.