|
попытка создания спектроанализатора, 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 поскажите, что надо сделать, чтобы устранить это вращение.Спасибо заранее и всех с наступающим Новым годом !
--------------------
|
|
|
|
|
 |
Ответов
(15 - 29)
|
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)  Хотя не понятно для чего создавать такой спектроанализатор сегодня знаете, если бы речь шла о том , где купить подешевле, то тема так бы и называлась, а так, отвечая на ваш вопрос - чтобы окончательно с ума не сойти - ...
--------------------
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|