реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> попытка создания спектроанализатора, XC3S250E-208 и ТФТ 480х234
andreichk
сообщение Dec 29 2012, 21:32
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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

поскажите, что надо сделать, чтобы устранить это вращение.Спасибо заранее и всех с наступающим Новым годом ! santa2.gif


--------------------
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 29 2012, 22:06
Сообщение #2


Гуру
******

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



Действительную и мнимую части надо не суммировать (для вывода графика), а получать из них "гипотенузу", т.е. корень квадратный из суммы их квадратов.

На первом этапе можно временно обойтись без корня, а только вычислить сумму квадратов реальной и мнимой частей. Это уже будет число сугубо положительное и дрыгаться вниз оно не будет. Ну, а корень из него нужен лишь для физического смысла амплитуды гармоники.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 29 2012, 22:15
Сообщение #3


Знающий
****

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



а вы разве не заметили? вот извлечение кв.корня из суммы квадратов

Код
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
);


--------------------
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 29 2012, 22:36
Сообщение #4


Гуру
******

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



Цитата(andreichk @ Dec 30 2012, 02:15) *
а вы разве не заметили? вот извлечение кв.корня из суммы квадратов


А как вы сами объясняете отрицательные значения у себя на графике, если честно складываете квадраты?
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 29 2012, 22:44
Сообщение #5


Знающий
****

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



Простите, я по ходу вас неверно понял. Вы хотели сказать, что извлечение кв.корня из суммы квадратов вообще можно исключить и тогда значения будут только положительными? Я проверю это прямо сейчас и выложу фото того, что получилось.


--------------------
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 29 2012, 22:50
Сообщение #6


Гуру
******

Группа: Модератор 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) перед тем, как извлекать корень. Хотя б для "очистки совести".
... в, впрочем, не поможет. Ведь если число воспринимается как отрицательное, то при сдвиге и делении знак сохранится.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 29 2012, 22:56
Сообщение #7


Знающий
****

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



блин, как это я проглядел? теперь я на распутье или выкинуть извлечение корня или переделать корку корня на 17 разрядов... хорошо, что есть выбор...Спасибо за подсказку.ночь длинная, буду копать..
исключил извлечение кв.корня и вот что получилось:
осталось только развернуть и дело в шляпе. спасибо за подсказку. santa2.gif


--------------------
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 29 2012, 23:08
Сообщение #8


Гуру
******

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



Цитата(andreichk @ Dec 30 2012, 02:56) *
блин, как это я проглядел? теперь я на распутье или выкинуть извлечение корня или переделать корку корня на 17 разрядов... хорошо, что есть выбор...Спасибо за подсказку.ночь длинная, буду копать..


Вы лучше переделайте так, чтобы корень извлекался из беззнакового числа, т.е. не считал старший бит за признак отрицательности.
Ведь оба квадрата у вас - числа положительные. Значит, у обоих разряд 15 пустой. Заполниться он может лишь при сложении. Но даже и в этом случае, разряд 16 не нужен, т.к. он с гарантией останется пустым.

Поэтому для суммы вам достаточно 16-разрядного числа, но только с той оговоркой, что оно беззнаковое. И корень должен это как-то понимать, всегда воспринимая аргумент беззнаковым. Общность от этого не теряется, т.е. из отрицательных чисел корень все равно извлекать нельзя.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 30 2012, 02:18
Сообщение #9


Знающий
****

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



вымучил наконец smile3046.gif


--------------------
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Dec 30 2012, 12:40
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Вы вобще то не сосвсем коректно вычисляете значения спектра. Поскольку если я правильно понял sqrt(|Re|+|I'm|) не является корректным значением

Для правильного вывода спектра желательно реализовывать 10*log10(Re*Re + I'm*I'm) Вэтом случае отсуствуют тяжело гелизуемые в железе функция sqrt и деления да и результат сразу в dB что увеличивает дин диапазон при отображении

Также есть возможность получения приблизительного значения sqrt( Re*Re + I'm*I'm) используя апроксимацию max(|Re|,|Im|)+min (|Re|,|Im|)*K при этом ошибка апроксимации ~5% что для отображения на экране впоне нормально .

Успехов! Rob.

Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 30 2012, 17:25
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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

Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко.... rolleyes.gif

правда как обычно какая-то фигня на экран полезла в виде зеркальных повторов. как от этого избавиться, вот ещё задачка..... smile3046.gif


--------------------
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Dec 30 2012, 17:47
Сообщение #12


отэц
*****

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



QUOTE (andreichk @ Dec 30 2012, 21:25) *
Хочется конечно логарифм встроить как вы советуете, только вот не могу найти готовых решений на верилоге. Мож у кого завалялось, поделитесь, если не жалко.... rolleyes.gif


..не жалко :
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
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 30 2012, 18:01
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 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
);


..пользуйтесь, всегда рады помочь.

спасибо, только обьясните как ей пользоваться. это же какая-то готовая корка и у меня такой нет. просто так она ИЗЕй не распознаётся.


--------------------
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Dec 30 2012, 18:08
Сообщение #14


отэц
*****

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



QUOTE (andreichk @ Dec 30 2012, 22:01) *
спасибо, только обьясните как ей пользоваться. это же какая-то готовая ф-ция. просто так она ИЗЕй не распознаётся.


..даа ладно! а у меня так работает, странно.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
andreichk
сообщение Dec 30 2012, 18:09
Сообщение #15


Знающий
****

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



RROR:HDLCompilers:87 - "math.v" line 86 Could not find module/primitive 'log10'


--------------------
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01519 секунд с 7
ELECTRONIX ©2004-2016