Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Въпрос за малко сметки !?
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6791
Страница 1 от 1

Автор:  me40 [ Вто Май 05, 2009 3:36 pm ]
Заглавие:  Въпрос за малко сметки !?

Въпросът ми се отнася до формулата по-долу

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 4:28 pm ]
Заглавие: 

Сметките с плаваща запетая ли ще ги реализираш, с цели числа ли, каква точност гониш ?

Автор:  me40 [ Вто Май 05, 2009 4:44 pm ]
Заглавие: 

За резултат ми трябва цялото число т.е ако:

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

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

Автор:  miro_atc [ Вто Май 05, 2009 5:25 pm ]
Заглавие: 

Код:
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:31 pm ]
Заглавие: 

Мисля, че синтезатора който мъчиш не е проектиран за тази цел. По-скоро е проектиран за стандартна мрежа от честоти, с определен кварц, така че да може лесно да се смятат честотите и да се генерират на определена стъпка. Произволна честота трудно ще се генерира по този начин. Умножението ти дава число по-голямо от 32-бита, трябва да минеш на 64-битова целочислена аритметика, ако искаш точност.

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

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

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

Автор:  me40 [ Вто Май 05, 2009 6:25 pm ]
Заглавие: 

Да, това с апроксимацията е вариянт, за който не се бях сетил.
Все пак системата ще работи, макар и с някаква грешка

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


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


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

Автор:  miro_atc [ Вто Май 05, 2009 6:33 pm ]
Заглавие: 

http://www.miscel.dk/MiscEl/miscel.html

Автор:  me40 [ Вто Май 05, 2009 6:52 pm ]
Заглавие: 

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

Автор:  [ Вто Май 05, 2009 7:53 pm ]
Заглавие: 

Не съм навътре в нещата, но мисля DDS чиповете са точно за тази цел, не са и кой знае колко скъпи.

Автор:  me40 [ Вто Май 05, 2009 8:05 pm ]
Заглавие: 

Аз тази формула от там я извадих. 9833 на analog devices.
Ама за момент помислих, че има по лесен начин.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/