acvarif 0 12 октября, 2017 Опубликовано 12 октября, 2017 · Жалоба Знаковый коррелятор работает по принципу совпадений или несовпадений выборок по сигналу с выборками по квадратурной модели. В качестве демонстрации Матлаб модель знакового коррелятора для ЛЧМ сигнала 47...53 кГц. Имеется ввиду, что сигнал и модель это цифровые (не синусоида) сигналы. Тоесть грубо говоря пропущенные через компаратор синусоидальные радиосигналы. %% инициализация 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,:) = x_log_cos(i,1); % x_log_col(2,:) = 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,:),x_log_sin(i,:)); % 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); По ходу получается что при максимальном совпадении сигнала с копией результат может быть как положительный так и отрицательный? Может тема немного не втой ветке форума, но думаю, что к цифровой обработке это гораздо ближе чем к ПЛИС. Почему отрицательный результат свертки и фактически максимума несовпадений также может считаться верным? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kluwer 0 14 октября, 2017 Опубликовано 14 октября, 2017 · Жалоба Знаковый коррелятор работает по принципу совпадений или несовпадений выборок по сигналу с выборками по квадратурной модели. В качестве демонстрации Матлаб модель знакового коррелятора для ЛЧМ сигнала 47...53 кГц. Имеется ввиду, что сигнал и модель это цифровые (не синусоида) сигналы. Тоесть грубо говоря пропущенные через компаратор синусоидальные радиосигналы. Во-первых, вы сами-то поняли, что написали? Во-вторых, если вы приводите код, то нужно выдрать ключевой кусок, а не вываливать всё ваше творчество, включая подготовку .mif-файлов и прочую требуху на форум. В-третьих, если вы всё-таки действительно понимаете, что такое "знаковый коррелятор", то кто вам мешает просто "отнормировать" результат. Если опорный сигнал у вас длиной N бит, то максимальное число совпадений равно N, а минимальное равно нулю. Так кто мешает просто "сдвинуть" шкалу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться