|
Корреляция |
|
|
|
Jul 20 2007, 07:48
|
Группа: Новичок
Сообщений: 7
Регистрация: 24-02-07
Пользователь №: 25 634

|
Извиняюсь заранее за глупый вопрос. Опыта в данной сфере - ноль, но так вышло, что необходимо разобраться, и как можно быстрее... В общем, суть такова - есть BPSK-модулированный сигнал с частотой несущей 4.092Mhz, c частотой дискретизации 40.92 Mhz. Задача - вычислить корреляцию сигнала с генерируемой псевдошумовой последовательностью (необходимо для "поиска" сигнала). Проблема в том, что не могу максимально точно отфильтровать постоянную составляющую из соответствующих квадратурных и синфазных составляющих. Максимум, что у меня получилось - на скриншоте (прямоугольный сигнал - соответствующая последовательность, т.е. в данном случае корреляция должна быть максимальна, но на деле, естественно, этого не происходит, т.к. принятый сигнал искажен). Пробовал разные фильтры - все равно искажения довольно сильные.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
(1 - 7)
|
Jul 20 2007, 11:10
|
Группа: Новичок
Сообщений: 7
Регистрация: 24-02-07
Пользователь №: 25 634

|
Ну в том-то и дело, что вычисляю все возможные значения корреляционного интеграла от 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 - Jul 20 2007, 12:08
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 20 2007, 14:02
|
Группа: Новичок
Сообщений: 7
Регистрация: 24-02-07
Пользователь №: 25 634

|
UPD. Скурил раздел учебника по ЦОС про корреляцию, кое что прояснил. Разобрался с корреляцией более-менее теоретически. Попробовал вычислить корреляцию по традиционной формуле. Все получается нормально, даже на нефильтрованных данных дает результат, очень близкий к ожидаемой оценке. Не знаю, что и сказать. Почему вычисление корреляции через БПФ и свертку не работает? Где я затупил?
|
|
|
|
|
Jul 21 2007, 17:42
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 5-06-07
Пользователь №: 28 207

|
Камрад, судя по тексту программы (код Голда...), ты работаешь с GPS-сигналами (или я ошибаюсь)? Задачу поиска сигналов конкреных навигационных спутников я в свое время решил, но без преобразования Фурье, а просто временной корреляцией. Если интересно, могу прислать текст программы и оцифрованный файл с GPS-приемника.
Кстати, если не секрет, что у тебя за исходный файл? Каким оборудованием записан?
|
|
|
|
|
Jul 24 2007, 06:42
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188

|
1. Точно не помню, но, по-моему, ifft уже нормирует результат на 1/n, поэтому еще раз делить не надо. Это может увеличит амплитуду пика корреляции.
2. Если в процедуре вычисления корреляции Вы абсолютно уверены, значит "сравниваете" разные сигналы. Например, берем N отсчетов двух одинаковых(по форме) сигналов, но у одного период T1, а у другого T2, т.е. сигналы вроде "одинаковые", а на самом деле разные. Проверьте свои сигналы S и G0, одинаковые ли они? Кстати, между делом, если T1=6, а T2=9, то необходимо вычислять корреляцию сигналов длиной 18.
Когда разгадаете эту тайну золотого ключика, расскажите...
|
|
|
|
|
Jul 30 2007, 10:35
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 046

|
Вот как вычислить ВКФ двух сигналов:
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);
Сообщение отредактировал Ghost2 - Jul 30 2007, 10:37
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|