Guest
Wed Mar 25, 2015 4:06 pm
Witam,
Robię demodulator AM na FPGA i mam pewien dylemat przy miksowaniu.
Mam dwie 12-to bitowe liczby ze znakiem (U2). Pakuję to do multiplikatora i na wyjściu generuje mi 24-bitowy iloczyn C=A*B. Problem jest w tym, że jedna z tych liczb, powiedzmy B=sin(omega*t) jest reprezentowana jako liczba 12-bitowa z zakresu <-2048,+2047>.Tymczasem wiadomo, że sinus jako funkcja przyjmuje wartości <-1,+1>. Na wyjściu tego miksera potrzebuję jednak tylko 12 bitów najbardziej znaczących. Które bity teraz z tych 24 wybrać? Gdyby to było w naturalnym kodzie binarnym, nie było by sprawy. A w U2, to mi się już samemu we łbie miksuje

)
J.F.
Guest
Wed Mar 25, 2015 4:06 pm
Użytkownik napisał w wiadomości
Quote:
Robię demodulator AM na FPGA i mam pewien dylemat przy miksowaniu.
Mam dwie 12-to bitowe liczby ze znakiem (U2). Pakuję to do
multiplikatora i na wyjściu generuje mi 24-bitowy iloczyn C=A*B.
Problem jest w tym, że jedna z tych liczb, powiedzmy B=sin(omega*t)
jest reprezentowana >jako liczba 12-bitowa z zakresu
-2048,+2047>.Tymczasem wiadomo, że sinus jako funkcja przyjmuje
wartości <-1,+1>.
I tu mamy pewien problem z liczba +1, ktora niewatpliwie wystepuje.
Quote:
Na wyjściu tego miksera potrzebuję jednak tylko 12 bitów najbardziej
znaczących. Które bity teraz z >tych 24 wybrać? Gdyby to było w
naturalnym kodzie binarnym, nie było by sprawy. A w U2, to mi się już
samemu we łbie >miksuje

)
Jesli sygnal tez ma zakres +/-2047, to uzyteczny wynik masz na bitach
22:11 (z 23:0)
11 uzytecznych bitow jednej liczby plus 11 uzytecznych bitow z drugiej
liczby daje nam 22 bity wyniku mnozenia (21:0).
Ale znak tez jest uzyteczny i trzeba go w wyniku zawrzec.
A on sie w U2 duplikuje na dwoch najstarszych bitach.
Tylko trzeba przemyslec co z tym +/-1, czy jak kto woli 2048.
A w ogole to w FPGA mozesz sobie jakis ciekawszy multiplikator
zrobic - np taki co policzy wynik 12 bit i to beda od razu najstarsze
bity.
Albo w ogole znaki osobno policzy...
J.
Piotr Wyderski
Guest
Wed Mar 25, 2015 6:08 pm
stchebel@gmail.com wrote:
Quote:
Mam dwie 12-to bitowe liczby ze znakiem (U2). Pakuję to do multiplikatora i na wyjściu generuje mi 24-bitowy
iloczyn C=A*B. Problem jest w tym, że jedna z tych liczb, powiedzmy
B=sin(omega*t) jest reprezentowana jako
liczba 12-bitowa z zakresu <-2048,+2047>.Tymczasem wiadomo, że sinus
jako funkcja przyjmuje wartości <-1,+1>.
Na wyjściu tego miksera potrzebuję jednak tylko 12 bitów najbardziej
znaczących. Które bity teraz z tych 24 wybrać?
Co drugi...
Jeżeli masz k*sin(t)*A, to przez jakie k należy podzielić?
Zrób tak, by Twój sinus przyjmujował wartości wartości
z przedziału (-1,1), np. mnożąc go przez 0,999..9 i problem
będzie trywialny: górne 12 bitów.
Pozdrawiam, Piotr
Piotr Wyderski
Guest
Wed Mar 25, 2015 6:10 pm
J.F. wrote:
Quote:
Tylko trzeba przemyslec co z tym +/-1, czy jak kto woli 2048.
Pozbyć się przez skalowanie.
Quote:
A w ogole to w FPGA mozesz sobie jakis ciekawszy multiplikator zrobic -
np taki co policzy wynik 12 bit i to beda od razu najstarsze bity.
Albo w ogole znaki osobno policzy...
Ale po co, skoro dziś standardem są gotowe sprzętowe bloki
mnożące 18x18 bitów?
Pozdrawiam, Piotr
Guest
Wed Mar 25, 2015 7:50 pm
W dniu środa, 25 marca 2015 15:49:12 UTC+1 użytkownik J.F. napisał:
Quote:
Użytkownik napisał w wiadomości
Robię demodulator AM na FPGA i mam pewien dylemat przy miksowaniu.
Mam dwie 12-to bitowe liczby ze znakiem (U2). Pakuję to do
multiplikatora i na wyjściu generuje mi 24-bitowy iloczyn C=A*B.
Problem jest w tym, że jedna z tych liczb, powiedzmy B=sin(omega*t)
jest reprezentowana >jako liczba 12-bitowa z zakresu
-2048,+2047>.Tymczasem wiadomo, że sinus jako funkcja przyjmuje
wartości <-1,+1>.
I tu mamy pewien problem z liczba +1, ktora niewatpliwie wystepuje.
Na wyjściu tego miksera potrzebuję jednak tylko 12 bitów najbardziej
znaczących. Które bity teraz z >tych 24 wybrać? Gdyby to było w
naturalnym kodzie binarnym, nie było by sprawy. A w U2, to mi się już
samemu we łbie >miksuje

)
Jesli sygnal tez ma zakres +/-2047, to uzyteczny wynik masz na bitach
22:11 (z 23:0)
Jakby się dało, to bym Ci wysłał mejlem dużego browara. Działa! Dzięki!
Guest
Wed Mar 25, 2015 7:53 pm
W dniu środa, 25 marca 2015 18:10:31 UTC+1 użytkownik Piotr Wyderski napisał:
Quote:
J.F. wrote:
Tylko trzeba przemyslec co z tym +/-1, czy jak kto woli 2048.
Pozbyć się przez skalowanie.
A w ogole to w FPGA mozesz sobie jakis ciekawszy multiplikator zrobic -
np taki co policzy wynik 12 bit i to beda od razu najstarsze bity.
Albo w ogole znaki osobno policzy...
Ale po co, skoro dziś standardem są gotowe sprzętowe bloki
mnożące 18x18 bitów?
Jak po co? Sygnał z ADC mam 12-to bitowy i tyle. A generator IP i tak wykorzystuje te sprzętowe multiplikatory 18x18.
Piotr Wyderski
Guest
Wed Mar 25, 2015 7:54 pm
stchebel@gmail.com wrote:
Quote:
Jak po co?
Po co Jarek chce to rzeźbić ręcznie, skoro ma makroblok...
Quote:
A generator IP i tak wykorzystuje te sprzętowe multiplikatory 18x18.
Toteż...
Pozdrawiam, Piotr
J.F.
Guest
Thu Mar 26, 2015 2:10 pm
Użytkownik "Piotr Wyderski" napisał w wiadomości grup
stchebel@gmail.com wrote:
Quote:
Jak po co?
Po co Jarek chce to rzeźbić ręcznie, skoro ma makroblok...
A generator IP i tak wykorzystuje te sprzętowe multiplikatory
18x18.
Toteż...
Zeby mozna bylo uzyc tanszej kosci, zeby mniej pradu zzeralo, zeby te
multpikatory do wazniejszych zadan wykorzystac itp :-)
Mnozenie zmiennoprzecinkowych robi sie nieco inaczej niz calkowitych,
o ile oczywiscie Stachowi to odpowiada.
J.
Piotr Wyderski
Guest
Thu Mar 26, 2015 5:43 pm
J.F. wrote:
Quote:
Zeby mozna bylo uzyc tanszej kosci
Nawet najtańsze Spartany to mają, to dziś standard.
Quote:
zeby mniej pradu zzeralo
Pajęczynka z logiki programowalnej od _sprzętowego_ bloku
mnożącego przy porównywalnej liczbie bitów? :-)
Quote:
zeby te multpikatory do wazniejszych zadan wykorzystac itp
Ale ich jest dużo... :-)
Quote:
Mnozenie zmiennoprzecinkowych robi sie nieco inaczej niz calkowitych
Akurat mnożenie to się robi tak samo (+suma wykładników), to
z dodawaniem i odejmowaniem są problemy, bo trzeba wyrównywać mantysy.
Pozdrawiam, Piotr