Jump to content
    

stealthisname

Участник
  • Posts

    49
  • Joined

  • Last visited

Everything posted by stealthisname


  1. для элементов меню, которые являются непосредственно дочерними для окна , под функцией вызова подразумевается действие, которое должно выполняться при разворачивании списка подпунктов меню поэтому это действие может выполняться, если при наведении должен был развернуться список подпунктов меню, даже если никаких подпунктов там нет проблема должна решиться, если добавить единственный подпункт и уже на него назначить необходимое действие придётся делать лишний клик каждый раз при выборе файла, но это может оказаться лучше, чем неожиданные срабатывания когда не надо
  2. подойдёт ли для Ваших целей, с учётом необходимости зарегистрить для реализации в FPGA, вот такой фильтр? с передаточной функцией H(z) = (1 - z^-2) / (1 - K*z^-2); и такой АЧХ K1 = 1-1/10; K2 = 1-1/100; b1 = [1,0,-1]; a1 = [1,0,-K1]; b2 = [1,0,-1]; a2 = [1,0,-K2]; fvtool(b1,a1,b2,a2); или нужен именно ФВЧ и способ зарегистрить именно исходный ФВЧ?
  3. если частота сигнала меняется с течением времени, то действительно, построение спектра сигнала "в упор" не подойдёт, так как в таком построении будет упущена информация об изменении частоты сигнала во времени, поэтому для определения изменения частоты сигнала во времени, можно воспользоваться построением спектрограммы вот пример построения спектра "в упор" для определённого сигнала и построение спектрограммы для этого же определённого сигнала по спектрограмме в таком случае можно оценить изменение частоты сигнала во времени, и на основе такой обработки сигнала можно строить алгоритм определения частоты сигнала с течением времени
  4. может подойти что-то вроде такой схемы первый график - сигнал и порог, второй график - моменты превышения порога, третий график - с учётом игнорирования всех дальнейших значений исходного сигнала
  5. при использовании блока Goto с указанием global в параметре Tag visability, сигнал со входа блока Goto становится глобальным для всей модели, и его можно использовать в других местах этой модели с помощью соответствующего блока From например можно передать таким образом сигнал между блоками, которые даже не соединены
  6. можно начать c описывания и проверки упрощенной версии Вашего модуля например, если дать возможность пользователю блока самому выбирать режим работы с помощью входного порта Load, то без внутреннего состояния State, логика выхода в зависимости от выбранного режима будет предельно простой always @(*) //Логика автомата case (Load) parall_out: Q = D; //Параллельный вывод logic_shft_left: Q = D << M; //Логический сдвиг влево на М разрадов logic_shft_right: Q = D >> M; //Логический сдвиг вправо на М разрадов ring_shft_left: Q = {D[WIDTH-1:0], D[WIDTH]}; // Кольцевой сдвиг влево ring_shft_right: Q = {D[0], D[WIDTH:1]}; // Кольцевой сдвиг вправо serial_out: Q = qQ[0];// Выводим младший разряд входного числа default: Q = D; //Параллельный вывод endcase и не придётся использовать выход Q в описании работы с промежуточной переменной qQ при последовательном выводе // Логика для последовательного вывода always @ (posedge clk, negedge res) // По приходу тактового импульса, в выходную переменную будет записываться [0] разряд входного числа if (!res) qQ <= 0; else if ((Load == serial_out) && (enable == 1)) // enable служит для разрешения записи входного числа в промежуточную REG переменную qQ qQ <= D; else if ((Load == serial_out) && (enable == 0)) begin qQ <= {qQ[0], qQ[WIDTH:1]}; // Сдвигаем входное число вправо для передачи следующего разряда end весь модуль будет выглядеть так module Universal_Shift_Register #(parameter WIDTH = 5) // параметр позволяет быстро менять разрядность входного числа (clk, res, D, Load, M, enable, out_state); localparam parall_out = 1, logic_shft_left = 2, logic_shft_right = 3, ring_shft_left = 4, ring_shft_right = 5, serial_out = 6; input res, clk; input [WIDTH:0] D; //Входное число input [2:0] Load; //Выбор действия input [WIDTH:0] M; //Количество сдвигаемых разрядов input enable; output [WIDTH:0] out_state; reg [WIDTH:0] Q; //Результат reg [WIDTH:0]qQ; //Промежуточная переменная always @(*) //Логика автомата case (Load) parall_out: Q = D; //Параллельный вывод logic_shft_left: Q = D << M; //Логический сдвиг влево на М разрадов logic_shft_right: Q = D >> M; //Логический сдвиг вправо на М разрадов ring_shft_left: Q = {D[WIDTH-1:0], D[WIDTH]}; // Кольцевой сдвиг влево ring_shft_right: Q = {D[0], D[WIDTH:1]}; // Кольцевой сдвиг вправо serial_out: Q = qQ[0];// Выводим младший разряд входного числа default: Q = D; //Параллельный вывод endcase // Логика для последовательного вывода always @ (posedge clk, negedge res) // По приходу тактового импульса, в выходную переменную будет записываться [0] разряд входного числа if (!res) qQ <= 0; else if ((Load == serial_out) && (enable == 1)) // enable служит для разрешения записи входного числа в промежуточную REG переменную qQ qQ <= D; else if ((Load == serial_out) && (enable == 0)) begin qQ <= {qQ[0], qQ[WIDTH:1]}; // Сдвигаем входное число вправо для передачи следующего разряда end // Логика для реализации передачи результата assign out_state = Q; endmodule такая упрощенная версия модуля работает корректно во всех шести режимах для проверки использовался такой тестбенч: так как тут нет конфликта с выходом Q, то такая упрощенная версия модуля синтезируется
  7. берём данные из файла и определяем количество отсчетов на символ в записанном сигнале load('DataEtalonGenerator.mat'); y0 = Y; sps0 = (12.8/1.023); % 12.5122 % старый sps задаемся необходимым целым количеством отсчетов на символ и передискретизирем сигнал в новой тактовой sps = 20; % новый sps t0 = (0:numel(Y)-1).'; % старая шкала времени t = (0:(sps0/sps):numel(Y)-1).'; % новая шкала времени y = interp1(t0,y0,t,'spline'); % % plot(t0,y0,t,y); data_out_struct.time = []; data_out_struct.signals.values = y; data_out_struct.signals.dimentions = 1; в блоке Eye Diagram задаем указанное новое количество отсчетов на символ глаз диаграмма точно стала лучше на вид, по ней видно, с каких точек можно строить созвездие, период известен, так как мы сами задали количество отсчетов на символ в передискретизированном сигнале так как Вам точнее известна частота дискретизации записанного сигнала, Вы можете точнее передискретизировать записанный сигнал, а значит и получить лучший результат
  8. если ключом является начальное состояние регистра ПСП, то заданы два заранее не известных 256-разрядных числа: начальное состояние регистра ПСП (r) и номер определённой точки (n), в которой необходимо вычислить значение ПСП алгоритм получается следующим если в нулевом бите n ( в n[0]) единица, то вычисляем сдвиг ПСП на 2^0, если в n[1] единица, то вычисляем сдвиг ПСП на 2^1, если в n[2] единица, то вычисляем сдвиг ПСП на 2^2, и так далее, пока не дойдём до n[255] в конце вычислений ПСП будет сдвинута ровно на заданное n как уже было сказано выше в теме, матрицу для вычисления сдвига ПСП на заданное число можно посчитать заранее, всего придётся заранее вычислить 256 матриц для такой реализации алгоритма с каждым новым шагом понадобится регистрить вычисления на всё большее количество тактов, поэтому результирующая задержка на весь расчёт будет больше 256 тактов, но всё ещё намного меньше, чем расчёт рекурсивным алгоритмом
  9. что является ключом? начальное состояние регистра ПСП или полином обратной связи?
  10. процесс перехода от исходный четырёх информационных бит к кодовому слову из 4B12B - это не систематическое кодирование, а процесс перехода от первых двух триплетов к кодовому слову из 4B12B - это систематическое кодирование можно говорить о систематическом кодировании в конструкции кода, если разбить процесс получения кодовых слов вот так:
  11. в коде (24,12) размер кодируемого слова равен 12 бит, кодового слова - 24 бита количество вариантов выбора первого кодового слова равно (2^24) во всех этих вариантах выбора первого слова, вариантов выбора второго кодового слова уже (2^24 - 1), ведь повторяющихся кодовых слов не должно быть для третьего кодового слова (2^24 - 2), для четвертого - (2^24 - 3) и так далее всего кодовых слов (2^12) и всего вариантов кодовой конструкции (2^24)*(2^24 - 1)*(2^24 - 2)* ... *(2^24 - (2^12 - 1)) примерный расчёт в матлабе N = 0; for i = 0:(2^12 - 1) N = N + log2(2^24 - i); % disp(24 - log2(2^24 - i)) end disp(floor(N)) выдаёт, что для таких кодовых конструкций N равно примерно 98303 если я не ошибаюсь в расчетах и не учитываю лишние варианты, перебор которых можно избежать, то количество перебираемых вариантов для таких кодовых конструкций равно примерно что-то порядка 1.72E29592
  12. ели при поиске кодов достаточно перебрать 2^N вариантов, то чему в таком случае равно N для перебора, в котором можно будет обнаружить код Голея (24,12,8)? будут ли в таком случае перебраны все возможные кодовые конструкции с параметрами кода (24,12)?
  13. я так и не нашел утверждения напрямую, что это невозможно, но очень похоже на то, что это основа языка - в выражениях функции выдают только один выходной аргумент, в общем случае такое никак не провернуть выражение с = 3*real(c)+1i*imag(c); делает тоже самое, или в общем случае с = U(real(c),imag(c))+1i*V(real(c),imag(c)); тоже, что и x0 = real(c); y0 = imag(c); x = U(x0,y0); y = V(x0,y0); с = complex(x,y);
  14. конкретно для перехода из полярных координат к комплексному числу, есть способ записать в одну строчку без промежуточных переменных С = rho.*exp(1i*theta); после некоторого времени работы с комплексными вычислениями в matlab это выглядит и красиво и наглядно вариант через pol2cart и complex очевиден даже без комментариев, по справке к этим функциям промежуточные переменные в данном случае не выглядят как костыли и не мешают, напротив, дают дополнительную информацию при отладке в случае, когда идёт обработка больших массивов данных и потеря памяти на промежуточные переменные не допустима, выражение [x,y] = pol2cart(theta,rho); С = complex(x,y); clear x y; является полным аналогом того, что Вам необходимо по функционалу (но не по количеству строчек кода)
  15. пробуем работу Вашей функции pvec на неудобных данных (Y много больше X ) x = [3.2, 1, 2.5, 7.123456, 3, 2]; y = [2.1, 3, 6, 4, 3.5, 2]*100; [xVec, yVec] = pvec(x,y); plot(xVec,yVec); grid on; for i = 1:numel(x) text(x(i),y(i),num2str(i)); end явно не то, что хотелось, и чем больше разница по масштабу у осей - тем страшнее результат идём другим путём строим исходный график без стрелочек, для вычисления масштабов plot(x,y); если на результирующей картинке этот график не единственный, то добавляем другие построения, если они могут изменить размеры осей вычисляем отношение масштабов для нашего графика norm_coef = diff(xlim)/diff(ylim); компенсируем разницу в масштабах if(norm_coef<0) x_norm = x/norm_coef; y_norm = y; [xVec, yVec] = pvec(x_norm,y_norm); xVec = xVec*norm_coef; yVec = yVec; else x_norm = x; y_norm = y*norm_coef; [xVec, yVec] = pvec(x_norm,y_norm); xVec = xVec; yVec = yVec/norm_coef; end выводим график со стрелочками plot(xVec,yVec); grid on; for i = 1:numel(x) text(x(i),y(i),num2str(i)); end проверяем, что всё работает при другом отношении масштабов (X много больше Y ) x = [3.2, 1, 2.5, 7.123456, 3, 2]*123; y = [2.1, 3, 6, 4, 3.5, 2]; plot(x,y); norm_coef = diff(xlim)/diff(ylim); if(norm_coef<0) x_norm = x/norm_coef; y_norm = y; [xVec, yVec] = pvec(x_norm,y_norm); xVec = xVec*norm_coef; yVec = yVec; else x_norm = x; y_norm = y*norm_coef; [xVec, yVec] = pvec(x_norm,y_norm); xVec = xVec; yVec = yVec/norm_coef; end plot(xVec,yVec); grid on; for i = 1:numel(x) text(x(i),y(i),num2str(i)); end
  16. в справке матлаба, в разделе MATLAB Compiler описаны способы создания исполняемого файла и при использовании функции mcc результат "does not include MATLAB Runtime or an installer" при использовании Application Compiler (можно вызвать командой applicationCompiler или deploytool) визард предложит варианты установки MATLAB Runtime нужные библиотеки в исполняемый файл упаковываться не будут, но после установки MATLAB Runtime на компьютер без самого матлаба, ваши приложения будут запускаться и работать используя библиотеки из MATLAB Runtime после установки MATLAB Runtime нужной версии на компьютере пользователя, можно будет генерить это и другие приложения функцией mcc на Вашем компьютере, уже без лишних установок и не упаковывая библиотеки в исполняемый файл
  17. результат умножения 0x6CD * 0x3F = 0x1AC73 весь регистр P равен 0x00000001AC73 выбранные в настройках 32 разряда - это старшие разряды, они равны 0x00000001
  18. при объявлении аккумуляторов, указываем напрямую, что необходимо использовать блоки DSP (* use_dsp48="yes" *) reg [31:0] sig_B_dsp [0:3]; добавляем к нужному аккумулятору в соответствии с индексом integer i; always @(posedge clk) begin for (i = 0; i < 4; i = i + 1) begin if (reset) begin sig_B_dsp[i] <= 0; end else begin if (sig_ind == i) begin sig_B_dsp[i] <= sig_B_dsp[i] + sig_A; end end end end в результатах синтеза, проверяем, что сгенерились именно DSP без использования регистров логики я проверял на вот таком модуле:
  19. вектора значений X и Y известны x = [3.2, 1, 2.5, 7.123456, 3, 2]; y = [2.1, 3, 6, 4, 3.5, 2]; вычисляем значения, необходимые для функции quiver dx = diff(x); dy = diff(y); выводим график со стрелочками quiver(x(1:end-1),y(1:end-1),dx,dy,0); grid on; xlim([0;10]); ylim([0;10]); выводим очерёдность for i = 1:numel(x) text(x(i),y(i),num2str(i)); end как вариант можно вывести направление переходов по середине отрезков dx = diff(x); dy = diff(y); quiver(x(1:end-1),y(1:end-1),dx/2,dy/2,0); hold on; plot(x,y,'.-'); hold off; grid on; xlim([0;10]); ylim([0;10]); for i = 1:numel(x) text(x(i),y(i),num2str(i)); end в некоторых случаях так нагляднее
  20. по спецификации AMBA AXI Protocol Specification для AXI (mm): "the data bus, that can be 8, 16, 32, 64, 128, 256, 512, or 1024 bits wide" данные действительно могут иметь отличную от 32 или 64 разрядов ширину данных для AXI и AXIS для AXI Lite данные могут иметь ширину только 32 или 64 разрядов "Two options for data bus width are supported, either 32-bit or 64-bit."
  21. мне для понимания работы с AXI(memory mapped) и AXIS (stream) очень помогло ознакомление с AMBA AXI Protocol Specification и AMBA AXI stream Protocol Specification по спецификациям и в AXI и в AXIS данные могут иметь отличную ширину данных от 32 или 64 разрядов: "TDATA_WIDTH must be an integer number of bytes and is recommended to be 8, 16, 32, 64, 128, 256, 512 or 1024-bits." если передаётся 256 бит с одного источника и если источник позволяет не дробить общую шину на отдельные, то нужно указать ширину данных 256 бит например вот так если у различных шин одинаковый клок и ресет, то нужно это напрямую указать в соответствующих интерфейсах _CLK и _RST, с которыми ассоциированы необходимые шины по спецификациям сброс может обрабатываться как синхронный и как асинхронный, но с учётом требований: "The reset signal can be asserted asynchronously, but deassertion must be synchronous after the rising edge of ACLK."
  22. для того, чтобы определить отсутствие оборотов, можно сравнивать значение найденного максимума с порогом. порог для простоты можно рассчитывать по усредненным значениям fft. в качестве примера можно попробовать такой алгоритм на сигнале из Вашего файла hilda_15625Hz_zero_to_middle. я вычислил fft для 512 отсчетов на протяжении всего файла. для каждого результата убрал первые несколько отсчетов - в них мы ожидаем сильную низкочастотную помеху. получилась такая спектрограмма. для каждого результата нашел среднее значение, и умножил на 12 - это порог, с которым сравнивается найденный максимум в начале файла шум не превышает порог во время включения уже виден нужный пик, но частота слишком быстро изменяется на интервале одного fft, поэтому порог не превышен после выхода искомой частоты на постоянную все выборки дают максимум, превышающий порог таким образом отсутствие оборотов не прошло алгоритм, PID/ADRC точно не подхватит ложный пик. Единственное, чем пришлось пожертвовать - скоростью захвата, так как мы определили включение немного позже действительного включения устройства. вот как выглядит спектрограмма с порогом видно, что алгоритм четко определяет только нужные пики искомой частоты и срабатывает только при включенном устройстве. результат работы алгоритма - оценка частоты аналогичные результаты для сигнала из файла hilda_15625Hz_zero_to_low с тем же размером fft и с тем же множителем при вычислении порога
  23. если FFT выдает комплексные значения, то учитывать нужно и действительную и мнимую часть. по описанию алгоритма Вы ищете максимум из значений, поэтому вместо корня из суммы квадратов действительной и мнимой части, можно использовать просто сумму квадратов действительной и мнимой части. При этом положение максимума останется прежним, но можно будет сэкономить на операции взятия корня.
  24. спасибо я ошибся, сказав, что такая сумма не возможна на DSP. вычисления у автора темы могут быть реализованы так как указано на первой схеме. но в этой схеме есть незначительная неточность, которая может из-за невнимательности ввести в заблуждение. схема получается такая не считая обозначений входов, все было правильно
  25. на первой схеме у автора темы таких входов нет, есть X1 Y2 и перенос. Есть ли возможность суммировать числа в DSP так, как указано автором темы на первой схеме?
×
×
  • Create New...