|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 7:50 pm
решава логиката (инспектор стрезов)
| Автор |
Съобщение |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 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 |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 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 |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
е, технически погледнато бъркаш, макар че идеята ти в основата си е вярна. но както казах, може да се мине без производни, стига да се натрупва директно фазата, макар че тогава рискуваме да получим грешка от флоат формата. събирането на флоат числа бачка при събираеми които се различават с не повече от към 6 порядъка, което при едно късо сканиране от 10 секунди не е проблем, но при процеси с неопределена продължителност проблема е гарантиран. аз затова не обичам double, понеже той много успешно замазва подобни проблеми и програмата може да спре да бачка чак след час да речем, докато при флоат при същите условия ще спре почти веднага и човек ще се усети.
но метода с нарастване на фазата е безалтернативен, когато функцията по която се мени честотата е неизвестна или сложна. ако се наложи ползването му в дълго работещи цикли, най-добре е да се дели по модул на всеки цикъл или поне през известно време, ето така:
fi+=2*pi*f*dt
fi=fmod(fi,2*pi)
|
| Пон Сеп 04, 2006 6:48 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
не разбирам... не съм сметнал производната правилно ли?
а логическо погледнато или бъркам или не бъркам
едит: ако ти се занимава замести твоя код с моя... Или излиза правилно АЧХ или не. Защото от коментара ти излиза че съм прав на теория, но бъркам на практика... затова ти казвам - пусни да видим практиката 
|
| Пон Сеп 04, 2006 7:28 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
ами първо тука:
float df = 200*T/dt;
трябва да е df=200*dt/T
обърнал си делението, макар че може да е правописна грешка
също така, пускаш f да нараства от 200, а не от 900. това също предполагам е правописна грешка
иначе принципно изглежда вярно, но не съм го пускал 
|
| Пон Сеп 04, 2006 7:49 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
разбрах какво имаш предвид
първото е очевАдна грешка, а второто само правописна наистина 
|
| Пон Сеп 04, 2006 7:58 pm |
|
 |
|
naguall
Ранг: Минаващ
Регистриран на: Сря Сеп 13, 2006 12:01 pm Мнения: 25 Местоположение: Плевен
|
къде си обявил dt 
|
| Нед Сеп 17, 2006 9:27 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
няма значение къде, не играе роля
|
| Пон Сеп 18, 2006 10:35 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|