Перейти к содержанию

Знаковый коррелятор

Знаковый коррелятор работает по принципу совпадений или несовпадений выборок по сигналу с выборками по квадратурной модели. В качестве демонстрации Матлаб модель знакового коррелятора для ЛЧМ сигнала 47...53 кГц. Имеется ввиду, что сигнал и модель это цифровые (не синусоида) сигналы. Тоесть грубо говоря пропущенные через компаратор синусоидальные радиосигналы.
CODE
%% инициализация

clc;
clear all;

f_begin = 47000; % начальная частота 47 кГц
f_end = 53000; % конечная частота 53 кГц
freq_noice = 50000;
noise_amp = 1.0; % амплитуда шума
freq_noice_amp = 0.5; % амплитуда шума на частоте freq_noice
f_dt = 26430; % частота дискретизации Гц (26434, 19734)
tch_begin = 0; % начальное время моделирования
tch1 = 0; % начальное время модели
tch2 = 9.72e-3; % конечное время модели (9.72, 13.0)
tch_end = 3*tch2; % конечное время моделирования
tch_dt = 1/f_dt; % время одного дискрета
%Nt = tch2*f_dt;

%% моделирование

% время моделирования от tch_begin до tch_end шаг tch_dt
%tch = linspace(tch_begin,tch_end,768);
% время существования моделей
tch_lf = tch1:tch_dt:(tch2-tch_dt);
tch_all = tch_begin:tch_dt:(tch_end-tch_dt);
% количество выборок в модели
tm = length(tch_lf);
tm_all = length(tch_all);
fprintf('Количество дискретов за время существ. моделей tch2 мсек %d\n', tm);

% Формирование ЛЧМ сигнала на участке 39 мсек
y_t1 = zeros(1,tm);
y_t2 = zeros(1,tm);
y_lf_t = chirp(tch_lf,f_begin,tch2,f_end, 'li', pi);
% шум
%noise = sin(2*pi*freq_noice*tch_lf) + noise_amp*randn(size(y_lf_t));
%y_lf = y_lf_t + noise;
% сигнал + шум
%y = cat(2,y_t1,y_lf,y_t2);
%y_t = cat(2,y_t1,y_lf,y_t2);
y_t = cat(2,y_t1,y_lf_t,y_t2);
% количество элементов матрицы y
%tst = length(y);
% fprintf('Количество дискретов за время моделирования 39 мсек %d\n', tst);
%noise = freq_noice_amp*sin(2*pi*freq_noice*tch_all) + noise_amp*randn(size(y_t));
noise = noise_amp*randn(size(y_t));
% шум по всей дистанции
%noise = freq_noice_amp*sin(2*pi*freq_noice*tch_all) + noise_amp*randn(1, tm_all);
% сигнал + шум
y = y_t + noise;
% длина матрицы сигнала
tst = length(y);

% косинусная модель
x_cos = chirp(tch_lf,f_begin,tch2,f_end);
% синусная модель
x_sin = imag(hilbert(x_cos));
% сигнал в противофазе
%x_sin = x_cos.*x_cos;


% модель cos в логике
x_log_cos = dec2bin( reshape( x_cos > 0, [], 1 ));
% модель sin в логике
x_log_sin = dec2bin( reshape( x_sin > 0, [], 1 ));
% сигнал в логике
y_log = dec2bin( reshape( y > 0, [], 1 ));
fprintf('Модель cos %s', x_log_cos);
fprintf('\n');
fprintf('Модель sin %s', x_log_sin);
fprintf('\n');
fprintf('Сигнал+шум %s', y_log);
fprintf('\n');
fprintf('\n');

% x_log_col = zeros(length(x_log_cos),2);
% for i = 1:length(x_log_cos)
% x_log_col(1,sm.gif = x_log_cos(i,1);
% x_log_col(2,sm.gif = x_log_sin(i,1);
% fprintf(' %s', x_log_col);
% fprintf('\n');
% end

% Following is a sample MIF:
% DEPTH = 32; % Memory depth and width are required %
% % DEPTH is the number of addresses %
% WIDTH = 14; % WIDTH is the number of bits of data per word %
% % DEPTH and WIDTH should be entered as decimal numbers %
% ADDRESS_RADIX = HEX; % Address and value radixes are required %
% DATA_RADIX = HEX; % Enter BIN, DEC, HEX, OCT, or UNS; unless %
% % otherwise specified, radixes = HEX %
% -- Specify values for addresses, which can be single address or range
% CONTENT
% BEGIN
% [0..F]: 3FFF; % Range--Every address from 0 to F = 3FFF %
% 6 : F; % Single address--Address 6 = F %
% 8 : F E 5; % Range starting from specific address %
% -- % Addr[8] = F, Addr[9] = E, Addr[A] = 5 %
% END

% запись в .mif
fid = fopen('modcossin2.mif','W');
count = 0;

fprintf(fid,'WIDTH = 2;\n');
fprintf(fid,'DEPTH = %d;\n', length(x_log_cos));
fprintf(fid,'ADDRESS_RADIX = UNS;\n');
fprintf(fid,'DATA_RADIX = BIN;\n');
fprintf(fid,'CONTENT BEGIN\n\n');
% for i=1:256
% fprintf(fid,'%d : ' ,count);
% count = count + 1;
% fprintf(fid,'%s%s ;\n', x_log_cos(i,sm.gif,x_log_sin(i,sm.gif);
% end
fprintf(fid,'END;\n');
fclose(fid);

%%
% бинарный формат моделей и сигнала
x_bit_cos = reshape( x_cos > 0, [], 1 );
x_bit_sin = reshape( x_sin > 0, [], 1 );
y_bit = reshape( y > 0, [], 1 );

% распечатка HEX кода моделей если кол. дискр. моделей без остатка /4
if (mod(tm,(4*round(tm/4))) == 0)
rsh_cos = reshape( x_cos > 0, [], tm/4 );
rsh_sin = reshape( x_sin > 0, [], tm/4 );
% модели в hex
x_hex_cos = dec2hex( bi2de(rsh_cos', 'left-msb'));
x_hex_sin = dec2hex( bi2de(rsh_sin', 'left-msb'));
% формат строки
formatSpec_x_cos_hex = 'Модель cos hex %s';
formatSpec_x_sin_hex = 'Модель sin hex %s';
% значения y_hex в hex виде
fprintf(formatSpec_x_cos_hex, x_hex_cos);
fprintf('\n');
fprintf(formatSpec_x_sin_hex, x_hex_sin);
fprintf('\n');
fprintf('\n');

% открытие файла на запись косинусной модели
fid = fopen('x_hex_cos.txt', 'wb');
% проверка корректности открытия
if fid == -1
error('File is not opened');
end

% запись в файл
fwrite(fid, x_hex_cos);
% закрытие файла
fclose(fid);

% открытие файла на запись синусной модели
fid = fopen('x_hex_sin.txt', 'wb');
% проверка корректности открытия
if fid == -1
error('File is not opened');
end

% запись в файл
fwrite(fid, x_hex_sin);
% закрытие файла
fclose(fid);

else
fprintf('Невозможно создать полный HEX код моделей\n')
fprintf('Количество дисретов моделей не делится без остатка на 4\n');
fprintf('Необходимо изменить частоту дискретизации \n\n');

end

z_cos = zeros(3*tm);
z_sin = zeros(3*tm);
z = zeros(3*tm);
% Коррелятор знаковый
for tm_mod = 1:(2*tm)

% побитовая XOR в матрицу xy_cos
xy_cos = bitxor(y_bit(tm_mod:(tm_mod+(tm-1))), x_bit_cos);
% побитовая XOR в матрицу xy_sin
xy_sin = bitxor(y_bit(tm_mod:(tm_mod+(tm-1))), x_bit_sin);
% проход по 256 выборкам
xy_cos_sum = 0;
xy_sin_sum = 0;
% квадратурная свертка
for i = 1:tm
% счетчик совпадений по модели cos
if (xy_cos(i) == 0)
xy_cos_sum = xy_cos_sum + 1;
else
xy_cos_sum = xy_cos_sum - 1;
end
% счетчик совпадений по модели sin
if (xy_sin(i) == 0)
xy_sin_sum = xy_sin_sum + 1;
else
xy_sin_sum = xy_sin_sum - 1;
end
end
% сумма
z(tm_mod) = xy_cos_sum + xy_sin_sum;
% подсчет совпадений по образцу "128-"
% z(tm_mod) = (tm/2 - length(find(xy_cos))) + (tm/2 - length(find(xy_sin)));

end

% максимальное значение в свертке
fprintf('Максимум в свертке %d\n', max(z(:,1)));
fprintf('\n');


%% графика

figure
tr = 1:tst;
plot(tr/f_dt, y), grid;
xlabel('Время мсек');
title('ЛЧМ сигнал');
zoom xon;

figure
plot(tch_lf, x_cos), grid;
xlabel('Время (в сек)');
title('ЛЧМ модель cos');
zoom xon;

figure
plot(tch_lf, x_sin), grid;
xlabel('Время (в сек)');
title('ЛЧМ модель sin');
zoom xon;

figure
tl = 1:(3*tm);
plot(tl, z), grid;
xlabel('Дискреты');
title('Знаковый коррелятор');
zoom xon;

% figure
% plot(tl, abs(fft(y))), grid;
% xlabel('Дискреты');
% title('Спектр сигнала');
% zoom xon;

% spectrogram(x_cos,256,250,256,0.01,'yaxis')

Работает коррелятор по принципу подсчета совпадений выборок по сигналу с выборками по копии (или модели sin и cos)
В железе (конкретно в ПЛИС) имеются два счетчика каждый из которых подсчитывает совпадения выборки по сигналу с выборкой по синусной и косинусной моделям по принципу
Код
        if (s_q_data xor s_q_sin) = '0' then
            s_div_sin <= s_div_sin + 1;
        else
            s_div_sin <= s_div_sin - 1;
        end if;

где s_q_data - сигнал s_q_sin - синусная модель
Также и с косинусной моделью
Код
        if (s_q_data xor s_q_cos) = '0'  then
            s_div_cos <= s_div_cos + 1;
        else
            s_div_cos <= s_div_cos - 1;
        end if;

Далее все тупо суммируется с учетом знака
Код
s_div_sum <= conv_std_logic_vector((conv_integer(signed(s_div_sin)) + conv_integer(signed(s_div_cos))), 10);

По ходу получается что при максимальном совпадении сигнала с копией результат может быть как положительный так и отрицательный?
Может тема немного не втой ветке форума, но думаю, что к цифровой обработке это гораздо ближе чем к ПЛИС.
Почему отрицательный результат свертки и фактически максимума несовпадений также может считаться верным?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Acvarif @ Oct 12 2017, 11:13) <{POST_SNAPBACK}>
Знаковый коррелятор работает по принципу совпадений или несовпадений выборок по сигналу с выборками по квадратурной модели. В качестве демонстрации Матлаб модель знакового коррелятора для ЛЧМ сигнала 47...53 кГц. Имеется ввиду, что сигнал и модель это цифровые (не синусоида) сигналы. Тоесть грубо говоря пропущенные через компаратор синусоидальные радиосигналы.

Во-первых, вы сами-то поняли, что написали?
Во-вторых, если вы приводите код, то нужно выдрать ключевой кусок, а не вываливать всё ваше творчество, включая подготовку .mif-файлов и прочую требуху на форум.
В-третьих, если вы всё-таки действительно понимаете, что такое "знаковый коррелятор", то кто вам мешает просто "отнормировать" результат. Если опорный сигнал у вас длиной N бит, то максимальное число совпадений равно N, а минимальное равно нулю. Так кто мешает просто "сдвинуть" шкалу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация