|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sergey Mudry 2:5020/400 10 Feb 2003 18:02:33 To : Zahar Kiselev Subject : нулевые значения функции -------------------------------------------------------------------------------- Hello, Zahar! You wrote to Vladimir Vassilevsky on Mon, 03 Feb 2003 05:44:08 +0300: ZK>>> По причине того, что частота исходного сигнала может быть разной и ZK>>> может медленно "ползать" от нескольких сотен герц до пары килогерц ZK>>> - я плохо себе представляю, как ТАКОЕ сделать. VV>> Самая обыкновенная ФАПЧ с гетеродином и sin/cos каналами. VV>> Для ускорения начального захвата можно оценить частоту с помощью VV>> простейшего частотного детектора. ZK> Как такое делается в виде электронной схемы - знаю и даже делал. ZK> А вот в виде программы - увы, я не настолько хороший ZK> программист...:( А смоделировать? Гетеродин ака синусоидальный генератор с переменной частотой можно сделать кучей способов (один из них приведен ниже). Фазовый детектор - можно сделать перемножителем с последующей фильтрацией результата. (Есть более простой и тупой способ - гетеродин сделать прямоугольным, и запоминать отсчет исходного сигнала при переходе этого прямоугольника из 0 в 1, но такой ФАПЧ запросто может захватить половинную частоту.) Далее - фильтр нижних частот. Если не силен в DSP - тоже можно смоделировать LC-фильтр с почти идеальными характеристиками. Точные значения L и C подбери в каком-нибудь Microcap'е соответственно полосе захвата. Выписываешь формулы для напряжений и токов для каждого элемента, для резистора: (закон Ома) I=U/R; для конденсатора: I=C*(dU/dt); для катушки: U=L*(dI/dt). Как они соотносятся между собой и входными и выходными сигналами - смотри по схеме и законам Кирхгофа. А практически для каждой L и C вводишь по переменной, хранящей текущее значение Il и Uc соответственно, и на каждый отсчет исходного сигнала пересчитываешь по формулам Il:=Il+(dt/L)*Ul и Uc:=Uc+(dt/C)*Ic, здесь Il, Ul - ток и напряжение для катушки, Ul, Uc - то же для конденсатора, dt - период дискретизации, L и C - индуктивность и емкость соответственно. Кстати, синусоидальный генератор запросто можно сделать моделированием идеального колебательного контура. Имеем L и C, соединенные параллельно, C имеет некоторое начальное напряжение U0, начальный ток в катушке равен 0. По законам Кирхгофа: Ul=Uc, Il=-Ic. Частота генерации равна f=1/(2*pi*SQRT(L*C)), амплитуда равна U0. Комбинируя все вышенаписанное, получим такой алгоритм (без оптимизации): === Cut === dt:=1/44100 C:=2.533e-6 L:=1e-2 U0:=1 Uc:=U0 Il:=0 for i:=1 to 20000 out[i]:=Uc Uc:=Uc-(dt/C)*Il Il:=Il+(dt/L)*Uc next === Cut === При таких L и C частота будет около 1000 Гц, частота дискретизации - 44100 Гц Я пробовал, даже с целочисленной 16-битной арифметикой получается красивый синус (если L и C брать в разумных пределах), с плавучкой совсем хорошо. With best regards, Serg, aka upx@nc.ru, upx@ukr.net --- ifmail v.2.15dev5 * Origin: Donbass Internet Center DIPT (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/12005096c2503.html, оценка из 5, голосов 10
|