Отговори на тема  [ 23 мнения ]  Отиди на страница Предишна  1, 2
решава логиката (инспектор стрезов) 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
близо си с математическата хипотеза. айде няма да ви мъча повече, досега мисля са минали всички които биха са пробвали. сигнала в случая отива не до 1100, а до 1300 - диапазона от 200 херца се удвоява. изхода от ситуацията е просто да напишем f=900+100*t/T, но по-нагледно би било да се ползва друга схема - директна промяна на фазата. нещо от рода на
fi+=2*pi*f*dt; // директно нарастване на фазата
signal=sin(fi);
тогава няма опасност от подобни математически капани, понеже сме си сигурни че фазата се променя с колкото трябва и няма нужда да теглим първи производни. обаче тук ни дебне друг капан, тоя път чисто компютърен. който иска може да се пробва да отгатне какъв е :) така че аз все пак ползвах (и за в бъдеще ще ползвам) по-трудния вариант - със теглене не производна.


Пон Сеп 04, 2006 8:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
аз нещо не виждам вариат да се мине без производни... може и да има някакъв трик, но няма смисъл да се лъже математиката..

Иначе функцията на сигнал т.е. S= 2*pi*f*t е правилна, само дети и f и t са променливи. Най-лесно е да се сметне df, което също като dt e константа. Тогава от дадена стойност може да получим следващата:

Sn+1 = Sn + 2*pi*f*dt + 2*pi*t*df (доколкото си спомням математиката...)

А със код би трябвало да изглежда:

float df = 200*T/dt;
float S = 0;
float f = 200;
for(float t=0;t<T;t+=dt)
{
float signal=sin(2*pi*S);

S+= f*dt + t*df;
f += df;
}

но може и да бъркам, не ми се мисли... най-лесно ще е @zaphod да го изтества ;-)


Пон Сеп 04, 2006 10:08 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
е, технически погледнато бъркаш, макар че идеята ти в основата си е вярна. но както казах, може да се мине без производни, стига да се натрупва директно фазата, макар че тогава рискуваме да получим грешка от флоат формата. събирането на флоат числа бачка при събираеми които се различават с не повече от към 6 порядъка, което при едно късо сканиране от 10 секунди не е проблем, но при процеси с неопределена продължителност проблема е гарантиран. аз затова не обичам double, понеже той много успешно замазва подобни проблеми и програмата може да спре да бачка чак след час да речем, докато при флоат при същите условия ще спре почти веднага и човек ще се усети.
но метода с нарастване на фазата е безалтернативен, когато функцията по която се мени честотата е неизвестна или сложна. ако се наложи ползването му в дълго работещи цикли, най-добре е да се дели по модул на всеки цикъл или поне през известно време, ето така:
fi+=2*pi*f*dt
fi=fmod(fi,2*pi)


Пон Сеп 04, 2006 6:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
zaphod написа:
е, технически погледнато бъркаш


не разбирам... не съм сметнал производната правилно ли?

а логическо погледнато или бъркам или не бъркам ;-)

едит: ако ти се занимава замести твоя код с моя... Или излиза правилно АЧХ или не. Защото от коментара ти излиза че съм прав на теория, но бъркам на практика... затова ти казвам - пусни да видим практиката ;-)


Пон Сеп 04, 2006 7:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
ами първо тука:
float df = 200*T/dt;
трябва да е df=200*dt/T
обърнал си делението, макар че може да е правописна грешка :)
също така, пускаш f да нараства от 200, а не от 900. това също предполагам е правописна грешка :)
иначе принципно изглежда вярно, но не съм го пускал :)


Пон Сеп 04, 2006 7:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
разбрах какво имаш предвид :-)

първото е очевАдна грешка, а второто само правописна наистина ;-)


Пон Сеп 04, 2006 7:58 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Сеп 13, 2006 12:01 pm
Мнения: 25
Местоположение: Плевен
Мнение 
къде си обявил dt :?:


Нед Сеп 17, 2006 9:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
няма значение къде, не играе роля


Пон Сеп 18, 2006 10:35 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

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


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

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