Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Знаковый коррелятор
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Acvarif
Знаковый коррелятор работает по принципу совпадений или несовпадений выборок по сигналу с выборками по квадратурной модели. В качестве демонстрации Матлаб модель знакового коррелятора для ЛЧМ сигнала 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);

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

Во-первых, вы сами-то поняли, что написали?
Во-вторых, если вы приводите код, то нужно выдрать ключевой кусок, а не вываливать всё ваше творчество, включая подготовку .mif-файлов и прочую требуху на форум.
В-третьих, если вы всё-таки действительно понимаете, что такое "знаковый коррелятор", то кто вам мешает просто "отнормировать" результат. Если опорный сигнал у вас длиной N бит, то максимальное число совпадений равно N, а минимальное равно нулю. Так кто мешает просто "сдвинуть" шкалу?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.