|
попытка создания спектроанализатора, XC3S250E-208 и ТФТ 480х234 |
|
|
|
Dec 29 2012, 21:32
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Привет народ. Вот вымучил ФФТ на корке , получилось что-то похожее на спектр. Во всяком случае на изменение частоты реагирует переползанием пиков сигнала по экрану. Только вот никак не соображу, как сделать так, чтобы пики сигнала располагались только сверху, а не вращались как умалишённые вверх-вниз. http://www.youtube.com/watch?v=Vy1yDr5oZU8...eature=youtu.beприлагаю куски кода по частям. 1. корка ФФТ в ИЗЕ Код reg [8:0]xn_re; always @ (posedge CLK_A) xn_re <= signal;
FFT FFT_A ( .clk(CLK_A), // input clk .start(1), // input start .unload(1), // input unload .xn_re(xn_re[8:0]), // input [8 : 0] xn_re min+max .xn_im(0), // input [8 : 0] xn_im .fwd_inv(1), // input fwd_inv .fwd_inv_we(1), // input fwd_inv_we .rfd(rfd), // output rfd .busy(busy), // output busy .dv(dv), // output dv .xk_re(xk_re), // output [8 : 0] xk_re .xk_im(xk_im) // output [8 : 0] xk_im ); далее блок математики , в котором сигналы с ФФТ обрабатываются и выводятся далее на экран Код wire [8:0]out_math; math math (// математика .clk(CLK_A), .dv(dv), .real_(xk_re), .imaginary(xk_im), .out_(out_math) ); и собственно сама математика Код module math ( input clk, input dv, input [7:0]real_, input [7:0]imaginary, output reg[9:0]out_ ); wire [15:0] real_re; wire [15:0] imaginary_; //модуль комплексного числа. multiplexor m_re ( .clk(clk), // input clk .a(real_), // input [7 : 0] a .b(real_), // input [7 : 0] b .ce(dv), .p(real_re) // output [15 : 0] p ); multiplexor m_im ( .clk(clk), // input clk .a(imaginary), // input [7 : 0] a .b(imaginary), // input [7 : 0] b .ce(dv), .p(imaginary_) // output [15 : 0] p ); reg [16:0] summe; always @ (posedge clk) begin summe <= real_re[15:0] + imaginary_[15:0]; end wire [8:0]out_m; sqrt sqrt ( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); //------------------------ ищем max ---------------------------------- wire [8:0] max = (dv == 1'b1) ? 1'b1: (( max < out_m ) ? out_m : 1'b1); //----------------------- нормировка по max wire [8:0] max_2; divider d_max ( .clk(clk), // input clk .ce(dv), // input ce .dividend(max), // input [8 : 0] dividend .divisor(2), // input [8 : 0] divisor .fractional(max_2) // output[8 : 0] fractional ); wire [8:0] res; divider d_res ( .clk(clk), // input clk .ce(dv), // input ce .dividend(out_m),// input [8 : 0] dividend .divisor(max_2), // input [8 : 0] divisor .fractional(res) // output[8 : 0] fractional );
always @ (posedge clk) begin out_ <= res[7:0] - 118;//двигаем по высоте. меньше - выше end
endmodule поскажите, что надо сделать, чтобы устранить это вращение.Спасибо заранее и всех с наступающим Новым годом !
--------------------
|
|
|
|
|
Dec 29 2012, 22:50
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(andreichk @ Dec 30 2012, 02:44)  Простите, я по ходу вас неверно понял. Вы хотели сказать, что извлечение кв.корня из суммы квадратов вообще можно исключить и тогда значения будут только положительными? Я проверю это прямо сейчас и выложу фото того, что получилось. Именно! Однако и корень квадратный из положительного числа не должен приобретать отрицательный знак. А то у вас сумма 17-разрядная: reg [16:0] summe; а корень берется только от 16 разрядов: .x_in(summe), // input [15 : 0] x_in Мне трудно предсказать, что от этого бывает. Вдруг функция sqrt() воспринимает бит 15, как знаковый и выдает от этого фигню? Сдвинули бы вы summe на разряд вправо (или поделили на 2) перед тем, как извлекать корень. Хотя б для "очистки совести". ... в, впрочем, не поможет. Ведь если число воспринимается как отрицательное, то при сдвиге и делении знак сохранится.
|
|
|
|
|
Dec 29 2012, 23:08
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(andreichk @ Dec 30 2012, 02:56)  блин, как это я проглядел? теперь я на распутье или выкинуть извлечение корня или переделать корку корня на 17 разрядов... хорошо, что есть выбор...Спасибо за подсказку.ночь длинная, буду копать.. Вы лучше переделайте так, чтобы корень извлекался из беззнакового числа, т.е. не считал старший бит за признак отрицательности. Ведь оба квадрата у вас - числа положительные. Значит, у обоих разряд 15 пустой. Заполниться он может лишь при сложении. Но даже и в этом случае, разряд 16 не нужен, т.к. он с гарантией останется пустым. Поэтому для суммы вам достаточно 16-разрядного числа, но только с той оговоркой, что оно беззнаковое. И корень должен это как-то понимать, всегда воспринимая аргумент беззнаковым. Общность от этого не теряется, т.е. из отрицательных чисел корень все равно извлекать нельзя.
|
|
|
|
|
Dec 30 2012, 17:25
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
в последней интерпретации я вообще исключил извлечение кв. корня и нормируюсь по МАХ просто суммой квадратов. Получилось намного красивее, во всяком случае пики задираются в одну сторону. Код module math ( input clk, input dv, input [8:0]real_, input [8:0]imaginary, output reg[8:0]out_ ); wire [17:0] real_re; wire [17:0] imaginary_; //модуль комплексного числа. multiplexor m_re ( .clk(clk), // input clk .a(real_), // input [8 : 0] a .b(real_), // input [8 : 0] b .ce(dv), .p(real_re) // output [17 : 0] p ); multiplexor m_im ( .clk(clk), // input clk .a(imaginary), // input [8 : 0] a .b(imaginary), // input [8 : 0] b .ce(dv), .p(imaginary_) // output [17 : 0] p ); reg [18:0] summe; always @ (posedge clk) begin summe <= real_re[17:0] + imaginary_[17:0]; end //------------------------ ищем max ---------------------------------- wire [8:0] max = (dv == 1'b1) ? 1'b0: (( max < summe[8:0] ) ? summe[8:0] : 1'b0); //----------------------- нормировка по max wire [8:0] max_2; divider d_max ( .clk(clk), // input clk .ce(dv), // input ce .dividend(max), // input [8 : 0] dividend .divisor(1), // input [8 : 0] divisor .fractional(max_2) // output[8 : 0] fractional ); wire [8:0] res; divider d_res ( .clk(clk), // input clk .ce(dv), // input ce .dividend(summe[8:0]),// input [8 : 0] dividend .divisor(max_2), // input [8 : 0] divisor .fractional(res) // output[8 : 0] fractional );
always @ (posedge clk) begin out_ <= res[8:0] - 305;//двигаем по высоте. меньше - выше end
endmodule Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко....  правда как обычно какая-то фигня на экран полезла в виде зеркальных повторов. как от этого избавиться, вот ещё задачка.....
--------------------
|
|
|
|
|
Dec 30 2012, 17:47
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
QUOTE (andreichk @ Dec 30 2012, 21:25)  Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко....  ..не жалко : CODE log10 log10( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); ..пользуйтесь, всегда рады помочь.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Dec 30 2012, 18:01
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Цитата(Lmx2315 @ Dec 30 2012, 18:47)  ..не жалко : Код log10 log10( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); ..пользуйтесь, всегда рады помочь. спасибо, только обьясните как ей пользоваться. это же какая-то готовая корка и у меня такой нет. просто так она ИЗЕй не распознаётся.
--------------------
|
|
|
|
|
Dec 30 2012, 19:19
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
QUOTE (andreichk @ Dec 30 2012, 22:09)  RROR:HDLCompilers:87 - "math.v" line 86 Could not find module/primitive 'log10' ..сарказм вам неведом. Сделайте табличную реализацию логарифма - если обойдётесь шагом в 3 дБ вам понадобится всего примерно 60 значений в табличке, вряд-ли больше. А захотите шаг 1 дБ - уместитесь в 180 строк, вам хватит за глаза.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Dec 30 2012, 21:36
|
Знающий
   
Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871

|
Цитата(Lmx2315 @ Dec 30 2012, 21:47)  ..не жалко : Код log10 log10( .clk(clk), // input clk .ce(dv), .x_in(summe), // input [15 : 0] x_in .x_out(out_m) // output [8 : 0] x_out ); ..пользуйтесь, всегда рады помочь. Со стороны как-то некрасиво выглядит, да и смысл жеста не понятен...
|
|
|
|
|
Jan 1 2013, 15:11
|
Частый гость
 
Группа: Свой
Сообщений: 128
Регистрация: 19-08-10
Из: Смоленск
Пользователь №: 58 991

|
Мне просто интересно, а как сигнал вводится в систему для анализа. Насколько я понимаю, качество съема сигнала и перевода его в цифру играет решающую роль при анализе спектра. Можете рассказать что именно анализируется, какие АЦП используются, какие фильтры стоят и т.д.
--------------------
Herz укроп и педрила
|
|
|
|
|
Jan 1 2013, 18:28
|
Частый гость
 
Группа: Свой
Сообщений: 128
Регистрация: 19-08-10
Из: Смоленск
Пользователь №: 58 991

|
Спасибо, схема интересная, единственное, чего могу сказать, OPA2652 честно отработает усиление в 30 не выше 10MHz, а судя по делителю, максимальное усиление как раз 30. Поэтому если будете пытаться получить реальный спектр сигнала, учтите, что операционники заваливают высокочастотный сигнал.
--------------------
Herz укроп и педрила
|
|
|
|
|
Jan 2 2013, 07:40
|
Знающий
   
Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515

|
Входную часть я бы делал примерно так:
Грубый/тонкий регуляторы смещения объединёны и регулятор упрощён с учётом того, что ОУ имеет по входу не меньший размах, чем по выходу, поэтому может использоваться в качестве буфера. Вход получится стандартный под осциллографический щуп с делителем. На схеме от andreichk ассиметрично включён драйвер АЦП, так он не будет держать постоянное синфазное напряжение. И ещё, резисторы регулятора усиления выбраны очень странно, которые с малыми номиналами, если вспомнить, чему равно усиление такой схемы. А триггерную схему можно вообще сделать в цифре, или подключать к выходу IC2, чтобы не грузить высокоомный вход. UPD:По драйверу АЦП возражение снимаю, его можно и так включать. И тонкое смещение действительно имеет смысл ставить после усилителя, чтобы его регулировка не зависела от коэффициента усиления.
Сообщение отредактировал Timmy - Jan 2 2013, 12:38
|
|
|
|
|
Jan 10 2013, 12:32
|
Группа: Новичок
Сообщений: 2
Регистрация: 10-01-13
Из: В. Новгород
Пользователь №: 75 139

|
Цитата(andreichk @ Dec 30 2012, 20:25)  правда как обычно какая-то фигня на экран полезла в виде зеркальных повторов. как от этого избавиться, вот ещё задачка.....  Очень похоже на спектр меандра Либо сигнал на входе АЦП очень мощный, либо ошибка в типах данных. В каком режиме работает АЦП ? signed или unsigned ? (ножка DF) Я так понимаю, ядро БПФ ждет signed.
|
|
|
|
|
Jan 10 2013, 15:14
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767

|
Цитата(andreichk @ Jan 1 2013, 20:41)  да вот собственно входная часть, никаких спецфильтров, только ОУ и всё. Фильтровать по аналогу перед ADC надо обязательно! Алиасинг иначе никак не победить потом.
|
|
|
|
|
Jan 10 2013, 19:20
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767

|
Цитата(Aner @ Jan 10 2013, 22:31)  Если счетные ресурсы есть, то фильтровать по аналогу перед ADC не обязательно. Алиасинг никто уже и не побеждает, его используют. Как вторую, третью и тд. зоны Найквиста. Очень интересно, как можно разделить сигналы из разных диапазонов, например из первого и из второго, оцифрованных одновременно?
|
|
|
|
|
Feb 2 2013, 09:53
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Цитата(MaverickDSP @ Jan 10 2013, 13:32)  В каком режиме работает АЦП ? signed или unsigned ? (ножка DF) Я так понимаю, ядро БПФ ждет signed. assign ADC_DF_DCS = 0;//Offset binary data, duty cycle correction on при желании можно переключить на assign ADC_DF_DCS = 1;//2's complement data, duty cycle correction on Цитата(Uuftc @ Jan 10 2013, 16:14)  Фильтровать по аналогу перед ADC надо обязательно! Алиасинг иначе никак не победить потом. а разве R86,R87,C30 не являются ФНЧ ? Цитата(Aner @ Jan 10 2013, 19:31)  Хотя не понятно для чего создавать такой спектроанализатор сегодня знаете, если бы речь шла о том , где купить подешевле, то тема так бы и называлась, а так, отвечая на ваш вопрос - чтобы окончательно с ума не сойти - ...
--------------------
|
|
|
|
|
Feb 4 2013, 14:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 687
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 884

|
Цитата(andreichk @ Feb 4 2013, 16:04)  Народ, для загрузки скопа в припаянную к спартану флеш, сдули у кого-то из сети и адаптировали под наш модуль(с изменением пинов и тактовой частоты) проект загрузчика флеш. загрузчик собрался и откомпилировался без проблем.Но не хочет грузиться в спартан из за этого сообщения: WARNING:MapLib:701 - Signal RS232_RXD connected to top level port RS232_RXD has been removed.Получается, что он отрубил линию загрузки в спартан прямо на входе, ссылаясь , что этот сигнал никуда не идёт. Весь проект перерыли , но найти обрыв не смогли. Может ктось глянет из опытных, если не влом.  то что трассировщик ругается на ногу, вовсе не означает, что всего лишь только с этой ногой проблема. Рассмотрите technology view после синтезатора - наверняка похерилось несколько блоков в результате оптимизации)
--------------------
Если хочешь узнать, что ждет тебя на дороге впереди, спроси у тех, кто возвращается по ней.
|
|
|
|
|
May 23 2013, 04:11
|
Группа: Новичок
Сообщений: 7
Регистрация: 30-10-12
Из: Н. Новгород
Пользователь №: 74 154

|
Цитата(andreichk @ Dec 30 2012, 22:09)  RROR:HDLCompilers:87 - "math.v" line 86 Could not find module/primitive 'log10' Здравствуйте andreichk. Можно пару вопросов по первому осциллографу SED1335, PIC18F4685 ? Собрал я его, работает нормально, но - 1. Синхронизация не работает. 2. кнопки управления А, В, АВ, SPECTR - работают, остальные нет, при нажатии А^ - фиксируется изображение. 3. На одном канале сильно рисуются вертикальные линии при отсутствии сигнала на входе. Где примерно искать причину. Спасибо. С уважением Александр.
|
|
|
|
|
May 26 2013, 12:29
|
Группа: Новичок
Сообщений: 7
Регистрация: 30-10-12
Из: Н. Новгород
Пользователь №: 74 154

|
Цитата(andreichk @ May 25 2013, 15:49)  мне кажется , что я уже писал, что не занимаюсь давно этим проектом, поэтому ничем помочь не могу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|