Генерація таблиці синусів

Дивно, я чомусь думав, що про cog я вже писав.

Знадобилася таблична генерація синусоїдальних сигналів — звичайнісінький функціональний генератор. Накопичувач фази та вибірка готового значення з таблиці. Не я перший, не я останній.

Цікаво, який метод отримання таблиці синусів для найпоширеніший?
Пошук в інтернеті готової таблиці з потрібними параметрами (розрядність даних, амплітуда, кількість квадрантів у таблиці та точок)?
Розрахунки у електронній таблиці (OpenOffice calc чи там MS Excel з експортом у .csv та переносом результатів у C-файл?

Не виключаю, що при певних навичках користування гуглом перший варіант дасть найшвидший результат 🙂
Але це не наш метод. Будь-яка зміна параметрів — і заново шукай чи міняй таблицю. Мені ж зазвичай хочеться автоматизувати процеси. Зрештою, «machines should work, people should think».

Як це часто буває, хтось вже все придумав, лише бери і користуйся.
Є такий чудовий генератор cog. Він шукає у вхідному файлі (написаному не обов’язково мовами С/С++) коментарі спеціальної форми, в яких розміщено пітон-скрипти, і породжує вихідний файл, у якому поруч з початковим текстом додається згенерований фрагмент коду. Тобто можна доповнити написаний код фрагментами, згенерованими автоматично. До генерації власне коду я не дійшов, а от таблички іноді генерую.

»»» Якось так…

Ще один транзисторний ключ

Продовження теми Транзисторні ключі — економимо резистори. Поштовхом до цієї публікації був перегляд статистики відвідувань сторінки 😉

Якщо з двополярного ключа, тобто третьої схеми тієї публікації, викинути все, що стосується позитивного плеча і залишити лише транслятор рівнів, то вийде така схема (нумерація елементів тут відповідає аналогічним за призначенням елементам тих трьох схем). Враховуючи те, що при «обірваному» емітері транзистор еквівалентний закритому діодові, «підтягувати» вхід потреби нема і схема спрощується до трьох елементів.

Ця схема може бути корисною для передачі сигналів у зону негативного джерела живлення. При використанні NPN-транзистора — навпаки, для передачі «знизу нагору», вище власного джерела живлення. Співвідношення емітерного та колекторного резисторів має приблизно відповідати співвідношенню амплітуди вхідного сигналу (для невеликих амплітуд врахувати падіння на переході емітер-база) та напруги живлення виходу.

Таку схему я колись радив для передачі сигналів між 5-вольтовою логікою та P-MOS схемами з живленням мінус 27 вольт.

Символ діаметру

І не лише він.

Вже багато років використовую розкладку клавіатури «Ukrainian unicode».
Спочатку вибирав її при налаштуванні Linux, тепер вже багато років ця розкладка встановлюється автоматично при виборі української мови системи. До речі, цю розкладку можна встановити і для Windows.

Переваги цієї розкладки для мене суттєві:
• У системі залишається дві розкладки — англійська та ця. Російську мову я використовую доволі рідко і можливості набрати російські літери Ы ы Ё ё Э э Ъ ъчерез правий Alt вистачало ще тоді, коли я відносно багато часу проводив на форумах, а зараз і поготів. Перемикання можна призначити на клавішу CapsLock — капсом я пишу ще рідше, ніж російською, а якщо сильно потрібно, то можна натиснути Shift-CapsLock. Індикацію вибраної розкладки для двох розкладок можна призначити на світлодіод ScrollLock на клавіатурі, що теж доволі зручно.
• Доступні символи, заради яких зазвичай доводилося перемикатися на англійську. Це «більше-менше», різноманітні дужки, косі риски.
• Доступні символи, яких раніше просто не було і доводилося пам’ятати код Unicode для набору через Ctrl-Shift-u або шукати потрібне через меню «вставити символ». Це ± та , еліпсис , градус °, лапки потрібного виду, em- та en- тире і © ® ™. Також є можливість поставити наголос та вставити нерозривний пробіл.

Але завжди хочеться більшого 😉

»»» Наприклад…

Десь щось горить

Кажуть, що брехня, що то у Києві димно через те, що горить ліс десь там у трикутнику Троєщина—Зазим’я—Бровари, бо вітер звідти не на Київ був, а горить насправді у Чорнобильській зоні.
Ну, там теж може горіти, чом ні?
Тільки вітер має бути дивний, щоб починаючи десь від озера Алмазного здувати все начисто кудись на схід чи навіть трохи північніше — ну щоб точно не на Київ, а от з-під Прип’яті — та от на Київ.

Та то таке, зрештою, цікавить не звідки вітер, а які мікрорентгени.

Тому я дістав власноруч зроблений ще на початку літа 1986-го дозиметр і вивісив трубочку за вікно. Трубка там СБМ20, «бере» далеко не все (але те, що вона не бере, давно розпалося) і грубувата, але для оцінки досить.
Показував від 12 до 18, зрідка 11 або 21 мікрорентген на годину. Тобто, непогано співпада з цим моніторингом. І це добре.

До речі, у «фаховому коментарі еколога», який бив на сполох з приводу того, які тут вітри, порогом дозволеного для Києва було названо 30 мР/год, а не 30 мкР/год — не доведи жити при рівнях «фахового еколога».

Зброя, мікроби і харч

Джаред Даймонд. Зброя, мікроби і харч : витоки нерівностей між народами.

Джаред Даймонд Зброя, мікроби і харч : витоки нерівностей між народами. — Київ: Ніка-Центр, 2009. — 488 с  — ISBN 978-966-521-512-7.

Книжка про те, чому більшість культурних рослин походить з Євразії, чому великі тварини залишилися здебільшого у Африці, а в Америках їх так і зовсім нема, та як з усім цим пов’язано те, що європейські народи завоювали інші частини Землі, а не навпаки.

Кілька років тому мені було цікаво її прочитати. Оце трапилася на очі, згадав, раджу.

Транзисторні ключі — економимо резистори

Стандартний транзисторний ключ

Стандартний транзисторний ключ

Типовий транзисторний ключ для вмикання напруги, вищої за напругу живлення мікроконтролера, виглядає приблизно так. Конкретні номінали резисторів та типи транзисторів залежать від комутованого струму.

Багатенько резисторів. По ціні — не так того резистора, як його запаяти. Часом, особливо на невеликих платах, просто жаль місця.

Резистори R2 та/або R3 іноді можна викинути. Діапазон цього «іноді» залежить від темпераменту розробника :-). R1 та R4 обмежують базові струми. Наче і не прибереш. Але… R4 можна прибрати.



Транзисторний ключ з джерелом струму

Транзисторний ключ з генератором струму

Обмежити струм бази VT2 можна, перетворивши каскад на транзисторі VT1 на генератор струму. Резистор R1, який обмежував базовий струм VT1, вилучається, натомість додається R5, який задає струм бази для VT2. R4 вже непотрібен.

Особливості схеми — струм бази VT2 не міняється у широкому діапазоні напруг +UIN і струм бази VT1 (споживання від джерела сигналу ON) — мінімально можливий.



Двополярний транзисторний ключ

Двополярний транзисторний ключ

Доволі цікавим, на мою думку, є розвиток цього підходу на двополярний ключ.

Основою ключа є двополярний генератор струму на транзисторах VT1, VT3 та резисторі R5. Співвідношенням опорів R3, R6 та R5 можна обрати необхідні напруги на затворах. Як і струм бази у попередньому варіанті, ці напруги не залежатимуть від вхідних напруг +UIN, -UIN.



Звичайно, і ці схеми мають свої недоліки, але мені вони подобаються і я часто їх використовую.

p.s. Про «цифрові транзистори» я знаю і їх теж використовую. У них — свої недоліки.
p.s.2 Продовження теми — ще один транзисторний ключ

Калькулятор

До речі, про octave.
Поступово ця програма стає моїм «настільним калькулятором». Все частіше використовую її для простих поточних обчислень замість графічного galculator. Купа зручностей: є історія набраних виразів, яка зберігається між запусками, можна додавати свої функції.

Ну от приклад:

Знадобилося погратися з паралельним з’єднанням трьох резисторів, скажімо, треба обчислити опір паралельно з’єднаних резисторів 10k, 4k7, 1k. Розрахунок через обернену суму провідностей з урахуванням векторної орієнтації octave виглядає так:

1 / sum(1 ./ [10,4.7,1])

Таким способом що два, що десять — набирати легко. Можна взяти з історії вираз, замінити/додати/прибрати резистор і отримати новий результат. Декілька разів скориставшись цим обчисленням я зрозумів, що пора додати у файл .octaverc домашнього каталогу таку функцію:

function res = par(rlist)
    res = 1 / sum( 1 ./ rlist);
end

Ця функція при старті octave автоматично додається до вбудованих і можна писати просто par([10,4.7,1]).

Варення з аґрусу

Є купа варіантів рецептів варення з аґрусу. Повен інтернет, нема сенсу цитувати. Але переважна більшість з них, окрім, хіба що, крайнощів, де ягоди перемелюються на пюре або де з ягоди «товстошкірого» аґрусу виймають насіння, вкладаючи замість нього шматочок горіха, — мають спільну рису.

Ця спільна риса, чи, радше, операція — надколювання ягід. Але чомусь в описах технології для цього пропонують використовувати «заточену виделку» (це ж продірявлювання, а не надколювання шкірки!) або ж дерев’яну шпичку. У моєї бабусі на те був спеціальний інструмент — простий у виготовленні й зручний у використанні. Звісно, ми використовуємо аналогічний.

Шматочок корка, набитий голками:

Calculate more to calculate faster.

Це може звучати дивно, але для того, щоб зменшити час розрахунків, часто слід збільшити загальний обсяг цих розрахунків. Тут я маю на увазі не «написати/згенерувати більше коду», як, наприклад, при розгортанні циклів при оптимізації -O3 у gcc (саме обчислень при цьому може стати менше за рахунок операції з лічильником циклу). Йдеться про отримання більшої кількості результатів обчислень, ніж це потрібно.

Візьмемо для прикладу такий алгоритм: якщо вхідна величина не перевищує заданий поріг, то видати її значення на вихід без змін, інакше взяти напівсуму входу та порогу. Мовою C алгоритм запишеться так:

»»» Читати далі…

Потокове редагування

Редактори (програми редагування текстів, а не редактори новинних сайтів ;-)) стають все «вмілішими» та «грамотнішими», ними все зручніше робити доволі складні речі. Особливо — проблемно-орієнтованими редакторами, на зразок Eclipse для програмістів чи Frescobaldi для набору нот мовою розмітки LilyPond.

Та іноді трапляються речі, які зручніше і швидше зробити старим добрим потоковим редагуванням, яке дійшло до нас з тих часів, коли з комп’ютером спілкувалися через телетайп і для того, щоб глянути на якийсь рядок тексту, його треба було надрукувати. По роздруківці тексту формувався пакет команд редагування і згодовувася програмі, яка брала порядко́во вхідний потік тексту, виконувала команди і записувала результат роботи у вихідний потік.
»»» Ось приклад:

[flagcounter image]