|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:41 am
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Въпрос за малко сметки !?
| Автор |
Съобщение |
|
me40
Ранг: Новодошъл
Регистриран на: Пет Авг 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 |
|
 |
|
me40
Ранг: Новодошъл
Регистриран на: Пет Авг 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 |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Избираш си едно от горните според точността която желаеш. Примерно 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 |
|
 |
|
me40
Ранг: Новодошъл
Регистриран на: Пет Авг 25, 2006 11:31 pm Мнения: 168 Местоположение: Русе
|
Да, това с апроксимацията е вариянт, за който не се бях сетил.
Все пак системата ще работи, макар и с някаква грешка
miro_atc, с каква програма намираш апроксимация на произволно число?
А има ли по-лесен начин за генератор през 1 hz?
Аз останах с впечатление, че това е най лесният начин.....
|
| Вто Май 05, 2009 6:25 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
|
| Вто Май 05, 2009 6:33 pm |
|
 |
|
me40
Ранг: Новодошъл
Регистриран на: Пет Авг 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 |
|
 |
|
me40
Ранг: Новодошъл
Регистриран на: Пет Авг 25, 2006 11:31 pm Мнения: 168 Местоположение: Русе
|
Аз тази формула от там я извадих. 9833 на analog devices.
Ама за момент помислих, че има по лесен начин.
|
| Вто Май 05, 2009 8:05 pm |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|