Отговори на тема  [ 10 мнения ] 
Въпрос за малко сметки !? 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Авг 25, 2006 11:31 pm
Мнения: 168
Местоположение: Русе
Мнение Въпрос за малко сметки !?
Въпросът ми се отнася до формулата по-долу

Fout=( Fmclk / 2^28 )*f или по точно ме интересува 28 битовата стойност на f=(2^28 * Fout) / Fmclk

,където:

F(out) - е честотата, която аз си избирам и е между 1 hz и 12 mhz
Fmclk - константа = 20 mhz (Честотата на кварцовият резонатор)
2^28 - константа = 268 435 456

Ако представя 20 000 000 = 2^8 * 78 125, то формулата ще придобие вида:

1. f= (1 048 576 * Fout ) / 78 125

или ако разделя 2^28/20 000 000 се получава

2. f=13.4217728 * Fout

В първият случай имам умножение на 24 битови числа (Fout=12 mhz) и резултатът е 48 битово число
Във вторият случай имам умножение на осем битово число, но със 7 знака след запетаята със 24 битово.

Няма ли по-лесен начин за получаване на нужното ми 28 битово число f ?


Вто Май 05, 2009 3:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Сметките с плаваща запетая ли ще ги реализираш, с цели числа ли, каква точност гониш ?

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Май 05, 2009 4:28 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Авг 25, 2006 11:31 pm
Мнения: 168
Местоположение: Русе
Мнение 
За резултат ми трябва цялото число т.е ако:

Fout=1 hz
то тогава f =13.4217728 т.е достатъчно ми е да получа 13

При Fout=11 999 999
то тогава f = 161061260.1782272
161061260 ми е достатъчно, но за да стигна до този резултат трябва да мина през число, което е повече от 32 бита
и става твърде сложно, поне за мен де. Та затова питам дали има някакъв друг начин?


Вто Май 05, 2009 4:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
Код:
Approximations to:   13.4218

Factor:   13.4286
Mult/div:   94/7
Error:   507 ppm
Max. input (7 bits):   1   -> 13
Max. input (8 bits):   2   -> 26
Max. input (15 bits):   348   -> 4673
Max. input (16 bits):   697   -> 9359
Max. input (31 bits):   22845570   -> 306783368
Max. input (32 bits):   45691141   -> 613566750

Factor:   13.4167
Mult/div:   161/12
Error:   -380 ppm
Max. input (8 bits):   1   -> 13
Max. input (15 bits):   203   -> 2723
Max. input (16 bits):   407   -> 5460
Max. input (31 bits):   13338407   -> 178956960
Max. input (32 bits):   26676815   -> 357913934

Factor:   13.4211
Mult/div:   255/19
Error:   -53.7 ppm
Max. input (8 bits):   1   -> 13
Max. input (15 bits):   128   -> 1717
Max. input (16 bits):   257   -> 3449
Max. input (31 bits):   8421504   -> 113025448
Max. input (32 bits):   16843009   -> 226050910

Factor:   13.4222
Mult/div:   604/45
Error:   33.5 ppm
Max. input (15 bits):   54   -> 724
Max. input (16 bits):   108   -> 1449
Max. input (31 bits):   3555436   -> 47721852
Max. input (32 bits):   7110873   -> 95443717

Factor:   13.4217
Mult/div:   1114/83
Error:   -6.41 ppm
Max. input (15 bits):   29   -> 389
Max. input (16 bits):   58   -> 778
Max. input (31 bits):   1927723   -> 25873294
Max. input (32 bits):   3855446   -> 51746588

Factor:   13.4218
Mult/div:   1973/147
Error:   -0.31 ppm
Max. input (15 bits):   16   -> 214
Max. input (16 bits):   33   -> 442
Max. input (31 bits):   1088435   -> 14608722
Max. input (32 bits):   2176871   -> 29217459

Factor:   13.4218
Mult/div:   12697/946
Error:   0.23 ppm
Max. input (15 bits):   2   -> 26
Max. input (16 bits):   5   -> 67
Max. input (31 bits):   169133   -> 2270065
Max. input (32 bits):   338266   -> 4540130

Factor:   13.4218
Mult/div:   22562/1681
Error:   -3.4e-9
Max. input (15 bits):   1   -> 13
Max. input (16 bits):   2   -> 26
Max. input (31 bits):   95181   -> 1277497
Max. input (32 bits):   190362   -> 2554995

Factor:   13.4218
Mult/div:   88275/6577
Error:   3.34e-9
Max. input (31 bits):   24327   -> 326511
Max. input (32 bits):   48654   -> 653022

Factor:   13.4218
Mult/div:   178523/13301
Error:   -7.17e-11
Max. input (31 bits):   12029   -> 161450
Max. input (32 bits):   24058   -> 322901

The "Max. input" specified the largest value that can be used as input without overflow.
The "->" specified the largest value that can come as output.
The error is specified as error in factor, not in calculations.
Input/output calculations assumes multiply before divide and no rounding.


Избираш си едно от горните според точността която желаеш. Примерно 1114/83= 13.421 и гледаш колко ти е максимума.. да кажем ползваш 32-бит целочислена аритметика, то макса е 3855446, значи ако Fout е по-голямо, за да нямаш препълване първо делиш на 83 после умножаваш по 1114 иначе обратното, т.е:

int f(unsigned int fout)
{
if(fout >= 3855446)
return (fout /83) * 1114;
else
return (fout*1114)/83;

}


Вто Май 05, 2009 5:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Мисля, че синтезатора който мъчиш не е проектиран за тази цел. По-скоро е проектиран за стандартна мрежа от честоти, с определен кварц, така че да може лесно да се смятат честотите и да се генерират на определена стъпка. Произволна честота трудно ще се генерира по този начин. Умножението ти дава число по-голямо от 32-бита, трябва да минеш на 64-битова целочислена аритметика, ако искаш точност.

Все пак едно една приблизителна стъкмистика с точност 3 знака след десетичната запетая. Вместо 1048576/78125 използвай 859/64, т.е.

1) умножаваш 859 по честотата; получаваш някакъв 64-битов резултат;
2) шифтваш надясно 6 пъти резултата ( така се дели на 64 );
3) получаваш твоето цяло число

Обратната калкулация ще ти даде каква грешка ще се получи в генерираната честота.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Май 05, 2009 5:31 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Авг 25, 2006 11:31 pm
Мнения: 168
Местоположение: Русе
Мнение 
Да, това с апроксимацията е вариянт, за който не се бях сетил.
Все пак системата ще работи, макар и с някаква грешка

miro_atc, с каква програма намираш апроксимация на произволно число?


Цитат:
Мисля, че синтезатора който мъчиш не е проектиран за тази цел.


А има ли по-лесен начин за генератор през 1 hz?
Аз останах с впечатление, че това е най лесният начин.....


Вто Май 05, 2009 6:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
http://www.miscel.dk/MiscEl/miscel.html


Вто Май 05, 2009 6:33 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Авг 25, 2006 11:31 pm
Мнения: 168
Местоположение: Русе
Мнение 
Ей, ама съм прост.......
Ами то елементарно...ама на кат' не се сещам.
Тъй като имам само умножение и деление във формулата щом при Fout=1 hz
се получава 13.4217728, то при 2 hz ще се получи 26.8435456 и т.н
До две 24 битови числа ( 134 217 728 * 12 000 000) мога да умножавам , а резултата ще ми е f.


Вто Май 05, 2009 6:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Не съм навътре в нещата, но мисля DDS чиповете са точно за тази цел, не са и кой знае колко скъпи.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Май 05, 2009 7:53 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Авг 25, 2006 11:31 pm
Мнения: 168
Местоположение: Русе
Мнение 
Аз тази формула от там я извадих. 9833 на analog devices.
Ама за момент помислих, че има по лесен начин.


Вто Май 05, 2009 8:05 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни