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

Aleksei_Rostov

Свой
  • Постов

    313
  • Зарегистрирован

  • Посещение

Весь контент Aleksei_Rostov


  1. Здравствуйте. Подскажите пожалуйста как увеличить скорость Ethernet по TCP/IP протоколу. Задача следующая: Есть пример Simple socket server, devboard Stratix II. Использую пример Standart. SSS изменил след образом: убрал все task в RTOS, кроме инициализации. После инициализации добавил функцию void sss_send_menu(SSSConn* conn) { alt_u8 *a = TESTSTREAMTOAVALONMM_0_BASE; /* указатель на память с данными */ alt_u8 strb; // сигнал на отправку пакета while(1) { IOWR_ALTERA_AVALON_PIO_DATA(SEND_PACKET_BASE, 0); // сигнал об отправке пакета, если единица strb = IORD_ALTERA_AVALON_PIO_DATA(STRB_PULSE_BASE); // считываю сигнал на отправку пакета, если 1 if(strb != 65) { send(conn->fd, a, 1452, 0); // отправляю 1452 байта } IOWR_ALTERA_AVALON_PIO_DATA(SEND_PACKET_BASE, 1);// формирую сигнал для обнуления strb } return; } Записываю в память в НИосе данные, после записи отправляю на компьютер. Данные следуют импульсами по 1024 байта каждые 850 мкс. То есть скорость достигается около 10 Мбит/с. Ethernet на плате 10/100 Мбит. Тем не менее принимается только один пакет (импульс данных). Другие пакеты иногда можно наблюдать не по TCP протоколу, а по FMTP, но не 1452 байта. а разбитые ппакеты по 509 байт. Другими словами все импульсы подряд выслать не получается. Что может влиять на скорость передачи данных? Есть предположение, что RTOS ограничивает быстродействие stack'а, выделяя на передачу пакета определенное время.
  2. Здравствуйте. Подскажите пожалуйста как переделать Simple Socket Server под UDP. Пока понял, что необходимо в BSP editor отключить enable_tcp. Изменить функции send(), recv() на sendto(), recvfrom(). Как быть с telnet клиентом (с его помощью в SSS открывается порт на компьютере)? Насколько я знаю он под TCP/IP.
  3. сложность задачи как раз и обусловлена двумерностью сигналов и помех. Сигнал S это например сигнал радиолокационной картографирующей станции, по которому осуществляется синтезирование изображения подстилающей поверхности. То есть, за интервал синтезирования станция принимает определенное количество отраженных импульсов. Тогда сигнал станции за интервал синтезирования можно представить в виде матрицы, каждая строка которой -- отраженный (принятый) ЛЧМ импульс, в определенный момент времени. Например, за интервал синтезирования накопленно 400 импульсов, каждый импульс составляет 1000 отсчетов. Получается матрица 400 на 1000. Постановка задачи заключается не в борьбе с помехой, а наоборот в создании "идеальной" помехи, которая позволяет управлять положением ложных объектов (за счет воздействия помехи, в данном случае имитирующей) на изображении, получаемом станцией. Принцип получения изображения станции, в двух словах, основан на свертке матрицы-сигнала по строкам (картинка по дальгности) и по столбцам(картинка по азимуту). Причем матрица сепарабельна, т.е. сворачивать в любой последовательности. Задача чисто теоретическая. Проще можно объяснить так: представим, есть постановщик помех (ПП). Задача поставить имитирующую помеху (т.е. максимально коррелированную с зондирующим сигналом станции) картографирующей станции. Что происходит: принимается один импульс станции, зеркально отображается, а это есть часть импульсной характеристики СФ для развертки дальности. Для азимута импульсная характеристика может быть известна априорно. Таким образом ПП синтезирует СФ картографирующей станции. Выбираем заданный отклик этого СФ, и находим какими характеристиками должен обладать помеховый сигнал для станции. Излучае обратно к станции, в изображении которой появляются ложные объекты
  4. Благодарю за ответ. Не ясно где прописан base FIFO write slave для записи или base FIFO read slave для чтения данных. system.h для FIFO /* * fifo_in configuration * */ #define ALT_MODULE_CLASS_fifo_in altera_avalon_fifo #define FIFO_IN_AVALONMM_AVALONMM_DATA_WIDTH 32 #define FIFO_IN_AVALONMM_AVALONST_DATA_WIDTH 32 #define FIFO_IN_BASE 0x1108c #define FIFO_IN_BITS_PER_SYMBOL 16 #define FIFO_IN_CHANNEL_WIDTH 8 #define FIFO_IN_ERROR_WIDTH 8 #define FIFO_IN_FIFO_DEPTH 16 #define FIFO_IN_IRQ -1 #define FIFO_IN_IRQ_INTERRUPT_CONTROLLER_ID -1 #define FIFO_IN_NAME "/dev/fifo_in" #define FIFO_IN_SINGLE_CLOCK_MODE 1 #define FIFO_IN_SPAN 4 #define FIFO_IN_SYMBOLS_PER_BEAT 2 #define FIFO_IN_TYPE "altera_avalon_fifo" #define FIFO_IN_USE_AVALONMM_READ_SLAVE 1 #define FIFO_IN_USE_AVALONMM_WRITE_SLAVE 1 #define FIFO_IN_USE_AVALONST_SINK 0 #define FIFO_IN_USE_AVALONST_SOURCE 0 #define FIFO_IN_USE_BACKPRESSURE 1 #define FIFO_IN_USE_IRQ 1 #define FIFO_IN_USE_PACKET 1 #define FIFO_IN_USE_READ_CONTROL 0 #define FIFO_IN_USE_REGISTER 0 #define FIFO_IN_USE_WRITE_CONTROL 1 /* * fifo_in_csr configuration * */ #define ALT_MODULE_CLASS_fifo_in_csr altera_avalon_fifo #define FIFO_IN_CSR_AVALONMM_AVALONMM_DATA_WIDTH 32 #define FIFO_IN_CSR_AVALONMM_AVALONST_DATA_WIDTH 32 #define FIFO_IN_CSR_BASE 0x11040 #define FIFO_IN_CSR_BITS_PER_SYMBOL 16 #define FIFO_IN_CSR_CHANNEL_WIDTH 8 #define FIFO_IN_CSR_ERROR_WIDTH 8 #define FIFO_IN_CSR_FIFO_DEPTH 16 #define FIFO_IN_CSR_IRQ 10 #define FIFO_IN_CSR_IRQ_INTERRUPT_CONTROLLER_ID 0 #define FIFO_IN_CSR_NAME "/dev/fifo_in_csr" #define FIFO_IN_CSR_SINGLE_CLOCK_MODE 1 #define FIFO_IN_CSR_SPAN 32 #define FIFO_IN_CSR_SYMBOLS_PER_BEAT 2 #define FIFO_IN_CSR_TYPE "altera_avalon_fifo" #define FIFO_IN_CSR_USE_AVALONMM_READ_SLAVE 1 #define FIFO_IN_CSR_USE_AVALONMM_WRITE_SLAVE 1 #define FIFO_IN_CSR_USE_AVALONST_SINK 0 #define FIFO_IN_CSR_USE_AVALONST_SOURCE 0 #define FIFO_IN_CSR_USE_BACKPRESSURE 1 #define FIFO_IN_CSR_USE_IRQ 1 #define FIFO_IN_CSR_USE_PACKET 1 #define FIFO_IN_CSR_USE_READ_CONTROL 0 #define FIFO_IN_CSR_USE_REGISTER 0 #define FIFO_IN_CSR_USE_WRITE_CONTROL 1 /* * fifo_out configuration * */ #define ALT_MODULE_CLASS_fifo_out altera_avalon_fifo #define FIFO_OUT_AVALONMM_AVALONMM_DATA_WIDTH 32 #define FIFO_OUT_AVALONMM_AVALONST_DATA_WIDTH 32 #define FIFO_OUT_BASE 0x11088 #define FIFO_OUT_BITS_PER_SYMBOL 16 #define FIFO_OUT_CHANNEL_WIDTH 8 #define FIFO_OUT_ERROR_WIDTH 8 #define FIFO_OUT_FIFO_DEPTH 16 #define FIFO_OUT_IRQ -1 #define FIFO_OUT_IRQ_INTERRUPT_CONTROLLER_ID -1 #define FIFO_OUT_NAME "/dev/fifo_out" #define FIFO_OUT_SINGLE_CLOCK_MODE 1 #define FIFO_OUT_SPAN 4 #define FIFO_OUT_SYMBOLS_PER_BEAT 2 #define FIFO_OUT_TYPE "altera_avalon_fifo" #define FIFO_OUT_USE_AVALONMM_READ_SLAVE 1 #define FIFO_OUT_USE_AVALONMM_WRITE_SLAVE 1 #define FIFO_OUT_USE_AVALONST_SINK 0 #define FIFO_OUT_USE_AVALONST_SOURCE 0 #define FIFO_OUT_USE_BACKPRESSURE 1 #define FIFO_OUT_USE_IRQ 1 #define FIFO_OUT_USE_PACKET 1 #define FIFO_OUT_USE_READ_CONTROL 0 #define FIFO_OUT_USE_REGISTER 0 #define FIFO_OUT_USE_WRITE_CONTROL 1 в этом файле в соответствии с документацией на On chip FIFO memory FIFO_IN_CSR_BASE -- это the base address of the FIFO control slave как быть с the base address of the FIFO write slave и the base address of the FIFO read slave? Изначально была мысль о FIFO_IN_BASE и FIFO_OUT_BASE соответственно. например в такой конфигурации происходит запись/чтение без проблем для одной переменной alt_u32 tmp, tmp_read; tmp = 0xff; // запись altera_avalon_fifo_write_fifo( FIFO_IN_USE_AVALONMM_WRITE_SLAVE, FIFO_IN_CSR_BASE, tmp); // чтение tmp_read = altera_avalon_fifo_read_fifo(FIFO_IN_USE_AVALONMM_READ_SLAVE , FIFO_IN_CSR_BASE); printf("read = %02x\n", tmp_read); Каким образом можно проверить что записан весь буфер? Можно, например, сформировать массив, записать используя altera_avalon_fifo_write_fifo, и как потом считать?
  5. Понемногу разобираюсь с документацией. Читаю регистр статуса. Возник вопрос: каким образом записать данные? Использую функцию altera_avalon_write_fifo(alt_u32 write_address, alt_u32 ctrl_address, alt_u32 data). Если правильно понял ctrl_address это адрес control slave reg, не понятно с write_address адресом base FIFO write slave. Может ли быть это любой адрес в FIFO memory, отсчитываемый от base FIFO control slave (с учетом адресного пространства зарезервированного под регистр статуса)? Проект в SOPC код Eclipse #include "altera_avalon_fifo_regs.h" #include "altera_avalon_fifo_util.h" #include "system.h" #include "sys/alt_irq.h" #include <stdio.h> #include <stdlib.h> #include "altera_avalon_pio_regs.h" #include "system.h" #include <stdio.h> int main() { alt_u32 tmp; tmp = 100; // чтение регистра статуса printf("LEVEL = %u\n", altera_avalon_fifo_read_level(FIFO_IN_CSR_BASE) ); printf("STATUS = %u\n", altera_avalon_fifo_read_status(FIFO_IN_CSR_BASE, ALTERA_AVALON_FIFO_STATUS_ALL) ); printf("EVENT = %u\n", altera_avalon_fifo_read_event(FIFO_IN_CSR_BASE, ALTERA_AVALON_FIFO_EVENT_ALL) ); //altera_avalon_fifo_write_ienable(FIFO_IN_CSR_BASE, 3); printf("IENABLE = %u\n", altera_avalon_fifo_read_ienable(FIFO_IN_CSR_BASE, ALTERA_AVALON_FIFO_IENABLE_ALL) ); printf("ALMOSTEMPTY = %u\n", altera_avalon_fifo_read_almostempty(FIFO_IN_CSR_BASE) ); printf("ALMOSTFULL = %u\n\n", altera_avalon_fifo_read_almostfull(FIFO_IN_CSR_BASE)); // запись в FIFO altera_avalon_write_fifo( 10 , FIFO_IN_CSR_BASE, tmp); return 0; } при этом возникает ошибка undefined reference to `altera_avalon_write_fifo' непонятно почему неправильно вызываю функцию `altera_avalon_write_fifo'... Ошибку нашел: в мануале функция неправильно названа (altera_avalon_write_fifo, а необходимо altera_avalon_fifo_write_fifo) записываю и читаю переменную следующим образом alt_u32 tmp, tmp_read; tmp = 0xff; // запись в FIFO altera_avalon_fifo_write_fifo( FIFO_IN_BASE, FIFO_IN_CSR_BASE, tmp); // чтение из FIFO tmp_read = altera_avalon_fifo_read_fifo(FIFO_OUT_BASE, FIFO_IN_CSR_BASE); printf("read = %02x\n", tmp_read); Однако вместо 0xff получаю значение read = 92980. Пока не ясно в чем проблема.
  6. Здравствуйте. Подскажите пожалуйста как работать с ядром On Chip FIFO memory core в Eclipse. С документацией пока еще разбираюсь. Задача следующая: данные записать с FPGA проекта в on chip fifo mem nios'а, потом по мере заполнения fifo считать в порядке их поступления. (для контроля вывести например на светодиоды) При этом функции типа altera_avalon_fifo_read_fifo() требуют адрес для чтения данных. Можно ли считывать с fifo без использования адресов? Например просто инициализировать массив данных по мере заполнения fifo mem для дальнейшего использования? Или подскажите, пожалуйста, с чего вообще начать работу с On Chip FIFO memory core.
  7. Большое спасибо за пример. Сразу не подумал, что можно обойтись и без прерываний. А как быть если в потоке входных данных содержатся два или более одинаковых числа? И их необходимо записать в массив внутри ниоса? Как я понял входной регистр ядра PIo не обновиться и соответственно не будет сигнала захвата фронта (edge_capture)?
  8. Здравствуйте. Только осваиваю Nios. Подскажите пожалуйста как решить следующую задачу. Собрал в Qsys простейшую схему: В Quartus собрал счетчик. Со счетчика подаю сигнал на Nios и возвращаю из Nios на светодиоды. Использование функций d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10); приводит к тому, что при медленном счете Nios выводит на светодиоды один и тот же отсчет многократно. Как сделать, чтобы сигнал из Nios на светодиоды выводился только один раз при приеме нового байта от счетчика?
  9. Большое спасибо за подробое объяснение. Если не секрет, рисунки с мультиплексорами, сумматорами, триггерами как рисовали? fpga advantage? Очень удобно для отчетов и описаний проектов...
  10. В проекте стал вопрос реализации опорного генератора нескольких частот. Изначально реализовать несколько DDS не представлялось возможным ввиду отсутствия свободных ресурсов по памяти. Поэтому рассматривал возможность реализации за счет вычислительных ресурсов. В итоге за счет оптимизации остальных алгоритмов проекта и его более детального осмысления проблем для реализации DDS не стало. Любопытство насчет CORDIC и Тейлора осталось (ранее не касался данных вопросов ввиду незначительного опыта работы с ПЛИС). Хотелось увидеть математику в работе (а именно как реализуются транцендентные функции, представленные полиномами). Да и вращение вектора в магистратуре использовал при повороте системы координат, только не знал, что такое CORDIC, "цифра-за-цифрой"... Насчет разбиения аргумента пока не обдумывал, но с удовольствием почитаю.
  11. Спасибо за совет. DSP блоки на кристалле есть, подхватываются при синтезе автоматом. Мат модель вычисления косинуса получилась (пока в MATLABе) для одной четверти периода. Часть алгоритма удалось привести к сдвигам, где то просто осталось умножение на постоянный коэффициент. CORDIC и Тейлора рассматривал в качестве альтернативе DDS, который неоднократно реализовывал. Стало интересно попробывать CORDIC и аппроксимацию Тейлором.
  12. на счет четверти периода и DDS знаю, реализовывал. Вопрос Вы поняли верно. Мат аппарат для ПЛИС хотелось бы сделать с целыми числами дабы не лезть в область действительных... Если я вас правильно понял то все вычисления необходимо свести к умножению/ делению на 2^i чтобы просто перейти к сдвигам вправо/влево? По крайней мере такая идея в голову приходила. Все было бы намного проще с использованием действительных чисел. Насколько знаю подобные конструкции несинтезируемы. Или возможно использование библиотек типа library IEEE_PROPOSED; use IEEE_PROPOSED.fixed_float_types.all;?
  13. Variable я понял так. Сравним два процесса: process (CLK) begin if (rising_edge(clk)) then a <= "11111"; b <= a; end if; end process; process (CLK) variable var: std_logic_vector(4 downto 0); begin if (rising_edge(clk)) then var := "11111"; x <= var; end if; end process; Результат моделирования следующий: Сигнал b примет значение сигнала а только в следующем такте, тогда как x принимает значение переменной немедленно. Насчет наличия "подводных камней" при синтезе variable догадываюсь, но пока не знаю. Если поделитесь опытом, буду благодарен. -- расчет x process(reset, clk) -- Declaration(s) variable x : signed(15 downto 0):= "0000110011001100"; begin if (rising_edge(clk)) then if (reset= '1') then -- Asynchronous Sequential Statement(s) x := (others => '0'); else -- Synchronous Sequential Statement(s) x := x - angley; end if; end if; xcos <= x; end process;
  14. Здравствуйте. Подскажите пожалуйста решение в вычислении полинома Тейлора на ПЛИС. Задача следующая: Необходимо реализовать генератор косинуса на ПЛИС. В качестве способа вычисления выбрана аппроксимация рядом Тейлора. Раскладываю косинус в ряд Тейлора и ограничиваю до слагаемого в 10-ой степени, что позволит аппроксимировать с высокой точностью полпериода косинуса, вторую половину периода можно получить просто умножив на -1. p(x)=a0 + x^2 * a1 + x^4 * a2 + x^6 * a3 + x^8 * a4 + x^10 * a5; где a0 = 1, a1 = -1/2!, a2 = 1/4!, .... Для реализации раскладываю полином по методу Горнера p(x)=a0 + x^2*(a1 + x^2*(a2 + x^2*(a3 + x^2*(a4 + x^2*a5)))); Логику реализации схемы Горнера я понимаю так: 1. Вычисление x^2; 2. Умножение на a5 + a4; 3. Умножение на x^2 + a3 и т.д. Не могу понять как на ПЛИС поступают с коэффициентами a0,a1,a2,a3,a4,a5, да и сам аргумент x должен меняться от 0 до pi (т.к. аппроксимирую только полпериода) Вот код MATLAB реализации схемы Горнера. Изменяя deltaPHI получаем косинус различных частот. Множитель norm ввожу чтобы представить коэффициенты целыми числами. Аргумент cnt изменяется от 0 до pi. При реализации это просто счетчик с переменным шагом счета. Не понятно как привести его значения в градусах %% служебные clc clear all gr=pi/180; % перевод из радиан в градусы %% N=512; % количество отсчетов deltaPHI=1; % град., приращение фазы (шаг) % коэффициенты для схемы Горнера norm=1; % нормирующий множитель a0=1*norm; a1=(-1/2*norm); a2=(1/24*norm); a3=(-1/720*norm); a4=(1/40320*norm); a5=(-1/3628800*norm); for i=1:N phi(i)=mod(i*deltaPHI*gr,180*gr); % изменение фазы сигнала от 0 до pi s(i)=norm*cos(phi(i)); end %% вычисление полинома на ПЛИС % регистры для записи промежуточных вычислений reg1=zeros(1,N); reg2=zeros(1,N); reg3=zeros(1,N); reg4=zeros(1,N); reg5=zeros(1,N); reg6=zeros(1,N); for i=1:N cnt(i)=mod(i*deltaPHI*gr,180*gr);% счетчик аргумента % возведение в квадрат reg1(i)=(cnt(i))*(cnt(i)); % умножение на а5 и суммирование а4 reg2(i)= reg1(i)*a5 + a4; % умножение на reg2 и суммирование а3 reg3(i)=reg2(i)*reg1(i) + a3; % умножение на reg3 и суммирование а2 reg4(i)=reg3(i)*reg1(i) + a2; % умножение на reg3 и суммирование а1 reg5(i)=reg4(i)*reg1(i) + a1; % умножение на reg3 и суммирование а1 reg6(i)=reg5(i)*reg1(i) + a0; end %% формирование сигнала коммутации для умножения на 1 или -1 % при реализации на VHDL -- аналог сигналу переполнения счетчика ssds=zeros(1,N); sd=0; for i=2:N if phi(i) < phi(i-1) sd=not(sd); end ssds(i)=sd; end %% умножение на 1 первого полупериода и на -1 второго... for i=1:N if ssds(i) == 0 Ix4(i)= s(i); Ix5(i)= reg6(i); else Ix4(i)= -s(i); Ix5(i)= -reg6(i); end end %% графическая часть figure(3) subplot(2,1,1) plot(1:N, Ix5,'r',1:N, Ix4,'b') legend('Gorner', 'cos') title('время') grid on subplot(2,1,2) plot(abs(fftshift(fft(Ix5)))) title('спектр') grid on
  15. C особенностью variable (немедленное определение значения, в отличие от signal ), тоже разобрался
  16. Спасибо за ответ. Эффект reset мне ясен, код я уже изменил. На счет variable пока не разбирался: обычный signal подойдет? Ресурсов ПЛИС очень жалко. Поэтому масшт коэффициент думаю рассчитывать (он равен для текущих x и y как sqrt(x^2 + y^2)).
  17. Здравствуйте. Необходим совет в реализации генератора sin/cos сигналов на ПЛИС с помощью CORDIC алгоритма. Алггоритм промоделировал в MATLAb'е работает без проблем. Вот функция алгоритма: function [I_sig Q_sig]=my_cordic(N, tgPHI) % tgPHI -- tan(radian) % N -- number of points I_sig=zeros(1,N); Q_sig=zeros(1,N); Kn=zeros(1,N); I_sig(1)=1; Q_sig(1)=0; for i=1:N Kn(i)=1/sqrt(1+tgPHI^2); I_sig(i+1)=Kn(i)*(I_sig(i) - Q_sig(i)*tgPHI); Q_sig(i+1)=Kn(i)*(Q_sig(i) + I_sig(i)*tgPHI); end end Функция возвращает N отсчетов косинуса и синуса, частота которых определяется приращением фазы (ее тангенсом) tgPHI. При реализации алгоритма возникли проблемы с масштабирующим коэффициентом Kn и задаваемой фазой tgPHI. Коэффициент и фаза дробные числа. При этом просто домножить их для получения целых чисел нельзя. Как выйти из этой ситуации? Вот код реализации CORDIC алгоритма на VHDL без масштабирующего коэффициента entity My_CORDIC is port ( clk : in std_logic; reset : in std_logic; phase : in signed(15 downto 0); cos : out signed(15 downto 0); sin : out signed(15 downto 0) ); end entity; architecture rtl of My_CORDIC is signal anglex, angley, xcos, ysin: signed(15 downto 0); begin -- расчет x process(reset, clk) -- Declaration(s) variable x : signed(15 downto 0):= "0000110011001100"; begin if (reset= '1') then -- Asynchronous Sequential Statement(s) xcos <= (others => '0'); elsif(rising_edge(clk)) then -- Synchronous Sequential Statement(s) x := x - angley; end if; xcos <= x; end process; -- расчет y process(reset, clk) -- Declaration(s) variable y : signed(15 downto 0):= "0000000000000000"; begin if (reset= '1') then -- Asynchronous Sequential Statement(s) ysin <= (others => '0'); elsif(rising_edge(clk)) then -- Synchronous Sequential Statement(s) y := y + anglex; end if; ysin <= y; end process; process(reset, clk) variable y : signed(31 downto 0):= "00000000000000000000000000000000"; begin if (reset= '1') then -- Asynchronous Sequential Statement(s) angley <= (others => '0'); elsif(rising_edge(clk)) then -- Synchronous Sequential Statement(s) y := ysin * phase; end if; angley <= y(31 downto 16); end process; process(reset, clk) variable x : signed(15 downto 0):= "00000000000000000000000000000000"; begin if (reset= '1') then -- Asynchronous Sequential Statement(s) anglex <= (others => '0'); elsif(rising_edge(clk)) then -- Synchronous Sequential Statement(s) x := xcos * phase; end if; anglex <= x(31 downto 16); end process; cos <= xcos; sin <= ysin; end rtl; Параметр phase должен определять частоту синтезируемого сигнала.
  18. Здравствуйте уважаемые математики. Необходим совет в решении одной задачи из радиотехники. Сразу сообщаю, что задача теоретическая и никакого отношения к практической реализации не имеет, что позволяет использовать всю широту мысли для поиска решения. В радиотехнике условие сформулировал следующим образом: Синтез "идеальной" помехи. Необходимо синтезировать оптимальный помеховый сигнал, обеспечивающий заданный отклик на выходе согласованного фильтра (СФ). При этом речь идет о двумерных сигналах (матрицы), т.е. помеховый сигнал, полезный сигнал, импульсная характеритика СФ, отклик являются матрицами. Математическая интерпретация задачи следующая: Дан входной сигнал-матрица S. Матрица сепарабельная (т.е. ортогональные преобразования, свертка могут браться в любой последовательности: сначала строки, потом столбцы или наоборот). СФ осуществляет операцию двумерной свертки. При чем импульсная характеристика СФ является сопряженной сигналу S. Задан требуемый отклик СФ матрица Yтреб. На входе СФ смесь сигнал\помеха S+P. Определить матрицу P, обеспечивающую требуемый Yтреб. Пока что решение в общем виде вижу следующее (по аналогии приведенной в Френкс 'Теория сигналов', Вакман 'Вопросы синтеза РЛ сигналов' и др): Допустим A это оператор или матрица преобразования входного сигнала СФ. Тогда получаемый отклик Y1=A*(S+P). Функционал I=Yтреб- Y1 характеризует ошибку (расстояние между получаемым и требуемым откликом). Минимизация функционала по матрице P позволила выразить бы саму эту матрицу. Вот и осталось разобраться как описать в матричном анализе оператор A, чтобы получить функционал, да и еще минимизировать его с дальнейшим определением "идеальной" помехи. Приветствуются любые советы для поиска решения, и необязательно в матричном анализе.
  19. Пока остановился на следующем: -- алгоритм кордик, с таблицей значений тангенса фаз, тех частот которые необходимы. В этом случае есть возможность задавать амплитуду каждой гармоники. Не совсем ясна задача пока по структуре радиолокационного портрета. Если придется формировать шум в доплеровском диапазоне, то в любом случае кордик алгоритм более уместен.
  20. Частота не перестраивается, если например, формируется одна радиолокационная цель, для нее фиксированный портрет, т.е. частоты определены. Может одновременно формироваться десяток целей, в этом случае десяток портретов и десяток многочастотных DDS (на каждую цель по одному). Изначально идея была: один DDS с десятками выходов для формирования десятка портретов. При этом на каждый портрет (многочастотный сигнал) рассчитать свой закон изменения фазы. Большое спасибо за советы, появились новые идеи как проще решить задачу.
  21. Многочастотный генератор необходим для формирования радиолокационных доплеровских портретов целей. Первый вариант плох тем, что требует значительное количество ресурсов памяти, например для достижения шага перестройки по частоте в 20 Гц, при f sample 20 МГц, буфер для DDS будет 20 МГц/ 20 = 1000 кБ (или 1000.000 8-битных отсчетов ). Даже при реализации DDS только на четверти периода, объем все равно 250 кБ. Это все надо влить в ПЛИС Stratix II EP2S60. Там 2 MRAM по 64 кБ плюс М4RAM -- 255 штук... Вообщем влезть-то DDS может и влезет, но еще есть целый тракт ЦОС...
  22. Буквально на днях решил подобную задачу: Радиолокационный цифровой приемник, лчм с дев 4 МГц на видеочастоте, после децимации. Сделал интерполяцию, дополнив нулями между соседними отсчетами, из расчета повышения fs в 4 раза. Далее поставил low БИХ, порядок 4, срез чуть больше ширины спектра ЛЧМ
  23. Есть задача: сформировать многочастотный (двух - пяти частотный) сигнал на ПЛИС с помощью DDS. Самый простейший вариант: собрать несколько DDS, синтезировать с их помощью сигналы с заданными частотами, потом сложить для получения многочастотного сигнала. А если просто на вход DDS подавать приращение фазы не по линейному закону, а по закону изменения фазы, например для двух (3, 4, 5-ти) частотного сигнала? Как описать математически данный закон для использования в ЦОС?
  24. Добрый день. Столкнулся с очередной проблемой при заруске примера Nios II Simple socket server. InterNiche Portable TCP/IP, v3.1 =============== Software License Reminder ================ This software project uses an unlicensed version of the NicheStack TCP/IP Network Stack - Nios II Edition. If you want to ship resulting object code in your product, you must purchase a license for this software from Altera. For information go to: "http://www.altera.com/nichestack" ===================================================== InterNiche Portable TCP/IP, v3.1 Copyright 1996-2008 by InterNiche Technologies. All rights reserved. Your Ethernet MAC address is 00:07:ed:ff:aa:20 prepped 1 interface, initializing... Created "Inet main" task (Prio: 2) Created "clock tick" task (Prio: 3) smsc91c111 Auto-negotiation: 100 Mbps, Full Duplex SMSC ethernet Rev: 0x3392, ram: 8192 mctest init called IP address of et1 : 192.168.1.234 DHCP timed out, going back to default IP address(es) Created "web server" task (Prio: 4) Web Server starting up Вместо Simple socket server starting up появляется сообщение о запуске примера Web server. Как решить проблему? В чем может быть причина?
  25. Решал подобную задачу следующим образом: 1. Написал протокол для UART 2. Из модуля протокола вывел сигнал о заполнении буфера для приема битов 3. По этому сигналу порисходит инкрементация адреса в блоке памяти, куда я складываю байты
×
×
  • Создать...