アフィリエイト広告を利用しています
ファン
検索
<< 2023年10月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最新記事
写真ギャラリー
最新コメント
タグクラウド
カテゴリーアーカイブ
月別アーカイブ
プロフィール
裏目小僧さんの画像
裏目小僧
プロフィール
日別アーカイブ

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2023年10月26日

スマートウォッチで血糖値を測る仕組み

血糖値が測れるというスマートウォッチが安価になっていたので購入した。
どんなセンサーが付いているのかと楽しみだった
人感LEDとか非接触体温計で製造量が増して安価になった焦熱センサを使ってるのかとかワクワクして


でも、測定時は血圧を測定する緑LEDが点灯するだけだった。
他には脈拍を測定するための赤LEDがあるがそちらは点灯しない。
緑LEDが参照光だとしてもグルコースを測定するなら赤外LEDが必要だろう。
砂糖水は透明だから可視光では測定出来ないからね。

1,脈拍はLEDの反射光で測定出来る。波長はあまり関係なく測定できるが最近は緑が主流。
2,血中酸素はパルスオキシメータとして日本での発明品。少なくとも赤色のLEDは必要
ここまでは十分正確に測定出来る。怪しくなるのは
3,血圧。血流速とかから予測するなら判るが、血管の2か所を測定するかせめて電圧測定の必要があると思いうのにそうなっていない。
 予想だが 脈拍測定から統計的にそれらしい値にしてるのだろう 相関は大きいからね

4,体温。これも表面温度なら判るが内部は判らない。非接触体温計のように焦熱センサを内蔵させても体表温度と腕時計の裏の温度は同じでほとんど意味がない。 遠赤外線は体内を透過しないからね。

そしてこの血糖値。どうせ
上司「なんとか血糖値を測定出来るようにしろ」
部下「中赤外レーザーが小さくて安価なら作れるのだけど」
上司「いいから、血圧も体温もそれらしいので売れてるんだから、それらしいのでいいんだよ。出来れば今のセンサーだけでな」
部下「じゃAIに5パラメータ与えた式の係数を求めさせてみます」
おお、統計処理したら80%は正確じゃないか、これでいいぞ。
てな感じで作られたんじゃないのかな

結果として 毎日 ほとんど同じ3つのピークを持つ曲線を描くだけの結果に。
それでもほとんどの人は1日3食だから問題ないのだろう。

1日に2色でも3つのピーク。 睡眠時間を変えても同じ曲線。

統計的には正しいのだろうけどさ
posted by 裏目小僧 at 14:15| Comment(0) | TrackBack(0) | 雑談

2023年04月09日

遅くなるWindowsアプリと高速になるJavaScript

ClipBd電卓という名前でエディタで作業中に数式をクリップボードに入れて計算させるツールを作っていた。高速に応答するようにexeサイズを100kb程度になるように作っていたのだが、昨年PCを購入直後は高速だったのに4か月程経過した今は、時に秒単位の遅れがある時がある。比べてJavaScriptはいつも同じ応答時間。
考えて見ればjavascriptがネイティブコードの1/10だとしても10年前のPCのネイティブコードより早いのだ。
という事は10年前にネイティブコード出来ていたことはJavaScriptで出来て当然。

逆に、なぜネイティブアプリがこんなふうに異様に遅くなのか不思議でしょうがないというのは置いておいて

という事で「簡単に計算式から音が出せるツール」についてはJavaScriptで作る事にした。
問題はJavaScriptをブラウザ上でユーザーに開放するのは出来ないこと。
ダウンロードした後は好きにすればよいが、ブラウザ上では制限しないと悪戯し放題になる。
そこで、以下のような方針と 簡易仕様を考えた。 まずは作ってみる。Audioクラスから WebAudioAPIにするのは、その使い勝手を見てから考える。

仕様(方針)
・JavaScriptのeval機能を使って実現するため悪戯防止の為に機能制限をする
・最初は強く機能制限し、後で緩和する
・追加時は他言語へのコンパイルも意識し他言語に翻訳可能な範囲とする
仕様(最初)
・変数名は英字+数字のみで英字は2文字に制限
・関数はMathの1変数関数に制限
・演算子も3項演算子のような複雑なものや文字列関係を除く
・if文/loop文は無い。 > < は正しいなら1 でなければ0
特殊な変数(定数)
PI 円周率(定数)
no 番号 1-110 no==81の時880H
n0 (no-12)/12 の整数が設定される
n1 0=C 2=D 3=E 4=F となる番号 no == n1 + n0*12+12
sw 呼び出したボタンが押されている間1 離されたら0
f 周波数(平均律で設定されるので必要ならn0,n1から求める)
fs サンプルレート
v0 音量が設定(yの値に後で掛け算されるので参照は不要だが音量に応じた応答をする場合用)
v 実行中に与えられる音量
v1〜v9 ツマミ類の為の予備
y 出力値 y=y0*v とするのがよい(実際の出力時v0が掛け算される)
y0 音量を設定する前の出力値
NZ -1〜+1の乱数
他 tm tA tD vS tR が予約されている n,t,vはユーザー用として使わない方がいい
式 変数 定数 関数 演算子 と()
変数 変数名 [a-zA-Z][a-zA-Z]?\d*
定数 小数点付 10進数のみ
関数 sin() cos() tan() log() log10() exp() abs() sqrt() ceil() randowm() round() trunc()
演算子 + - * / > <
文 変数=式;
実装文 文の集まり

プログラム プログラムは文字列で与えられる。
プログラムの解釈の前に全ての改行と空白タブは除かれる。
初期化部(無ラベルのの実装分)の後 A部 D部 S部 R部が続き文字列が終了する
全体の形は
初期化 実装文;
A:秒:実装文;
D:秒:実装文;
S:量:実装文;
R:秒:実装文;
となる。
秒と量は変数又は数値又は数式で設定する 変数・数式が使われても初期化後の値で固定される
量 最大は1なので 0.6のように設定する
ADSRの実装文は指定秒とSはボタン押し中に繰返し実行される
またv 変数が更新される A: 0->1に大きくなり D:1->v0->S量に小さくなり S:指定量 R: s量->0へと小さくなる
vは直線状に変化するので必要なら加工して独自エンベロープを作ればよい。
基本的にvに従う必要はなく独自の処理をすればよい。

A以外は省略出来る。省略時は秒/量は0となる
DSR各部の実装部を省略した場合A部の実装部が呼ばれる
実装した場合はyを更新する式が一つは必要

全体の処理:キーボードが押されると
初期化部が1回実行されと、ADSRの秒量が計算され記録される
その後AとDが指定秒間、繰返し実行される。
ADが終了してもボタンが押されていればSがボタンが離されるまで繰返し実行される
最後に Rが指定秒実行され終了する
A+D中にボタンが離されてもA+DとRは実行される

2023年04月06日

JavaScript で Audio() 3音にしたら、だいぶ良い感じ










wavFileでダウンロード






3音分のAudioオブジェクトを確保して順に使ってみました。
同時に音が出るとクリップするので少し音量を下げています。
前回の1音のものと比べてブツブツ切れる感じが減っていると思います。
これで「計算による音作りを楽しんでもらう」という目標の為にはEVALでJavaScriptを直接入れてもらうと達成なような・・・でもそうするとJavaScriptで悪戯も可能なので、何か制限をかけて(簡易言語のような方式で)出来ないか考慮中

あ、画面幅によっては、鍵盤押しに甘い部分があるみたい。修正等あればこちらに修正したソースを

2023年04月04日

JavaScripで音を出す 初めの一歩










wavFileでダウンロード

ボタンを押すと音が出ますから注意して下さい。
マウスを波形の上に持ってゆくと波形がスクロールします。

web Audio APIではなく Audioクラスのplayで音を出しています。
そのためにbase64エンコードが必要なようでFileReader()オブジェクトを使う為に音が出るまで遅延が酷い。
やはりweb Audio APIを調べないといけないようです。

JavaScriptソースを見たい人はこちら

3枚の内歯車














偏芯運動する外歯に回転する内歯車の内側に偏芯しながら回転する内歯車
息抜きに

2023年03月31日

Z変換とラプラス変換も同時に処理できる事に気づいた




グラフ上マウス等でf0付近をドラッグすればf0を変更可


3月の初めころから頑張って作っていたけど、
1,Z変換式をグラフ表示するツールをpascalで作ってからJavaScriptで動かそう
2,ある程度動いたけど、アナログとの比較の為にラプラス変換のグラフも出来た方がいい
3,まあラプラス変換はZ変換より簡単だからJavaScript側で変更すりゃいいか
4,おお中間コードに変換しない分 半分以下のサイズになったぞ
5,あれ? Z変換も同じように出来るんじゃないか?
6,あZ変換もラプラス変換も違いは小さい。というかe^sがzだった
7,なら一緒に扱えるようにすりゃいいや
という事で いちおう 当初のグラフ表示するまでの予定は達成したけど、なんだか物凄く遠回りしたようでモヤモヤする

z変換とラプラス変換で周波数特性を得るjavascript

2023年03月25日

JavaScriptでラプラス変換の伝達関数を求める
























デモの為に最初はフィルタを巡回表示しています。
その為に この画面を表示していると、フォーカスが勝手に移る為、操作が鬱陶しいかもしれません。(フォーカス移動は止めました)
ご迷惑をかけたなら、ごめんなさい。
ボタンを押せばしばらくは 巡回が止まります。
上手く表示されていないなら  JavaScriptでラプラス変換の伝達関数を求める 

2023年03月21日

JavaScriptでGUI









Z変換でグラフ表示する部分がほぼ動くようになった
ただスライドバーで特性を動かすとなると画面作りが面倒になる。そこで画面内をGUI的に動かすようにしたい。
その実験として以前作りかけた4つの歯車をマウス操作で動くようにしてみた。

面倒なのはmousemoveにはoffsetXがあるのに touchmoveには無い事。

この歯車のソースコードは

4つの歯車

2023年03月19日

pascalとJavaScript 関数内関数でハマった

Z変換の周波数特性表示の為に 数式処理をpascalコードからJavaScriptの変換作業をしてるのですが
最初クラスで書いてJavaScriptに変換しようとすると大量のthisに溢れたコードで鬱陶しくなり、これはダメだと 関数内関数に変更しました。
問題は数式処理をreplaceのコールバック関数を使った為にpascal側では関数内関数をコールバック出来ない事。
仕方なくpascal側ではreplace関数をexecで展開して呼ぶように修正。

さて大丈夫かと思ったら、大量の実行エラー。原因はクラスメンバー参照。
Pascal側では関数内関数でもselfはそのクラスを示しているし、メンバー参照も出来るのですが
JavaScriptの関数内関数はthisを自動では引き継いでくれないようです。
func1(param1,param2)の代わりに func1.call(this, param1, param2); てな置換が必要。
そうすると短い関数呼び出しが長くなってやはり鬱陶しい。
関数内関数にした事でメンバー数は減っているので
関数の先頭で z:=self;のように代入して関数内関数からはzを参照するように変更しました。
作ったツールでjavascriptに置換して thisを探して 元のpascalにz.を付ける作業をして全体が動きやっとデバッグが出来る状態に。

他にもAND OR は & | にしておけば論理でもバイナリでも問題ないけど not は ~ だと論理式の場合常にtrueになってしまうとか、なかなか厄介です。(notはif while untilで最初に見つけたら!に変換する事にしたけど)



posted by 裏目小僧 at 04:35| Comment(0) | TrackBack(0) | Lazarus

2023年03月16日

閉じなくなったコンソール

少し前 printfデバッグの為にコンソールを使う話を書きましたが、GUIアプリでAllocConsoleでコンソールを開いてFreeConsoleで閉じようとして奇妙な事に気づきました。32bit時代にはFreeConsoleで閉じていた窓がWin11で閉じなくなったのです。
64bitアプリだけかと思いましたが32bitでも同様の状況。
検証1
FreeConsoleして残ったコンソールを閉じた場合 →GUIアプリはそのままです。

検証2
AllocConsole → FreeConsole → AllocConsole とすると2つ目のコンソールが開きます。
2つ目のコンソールを閉じるとGUIアプリは道連れに終了してしまいますが
1つめのコンソールを閉じてもGUIアプリはそのままです。
どちらも
CloseWindowsは効く
DestroyWindowでは終わらない。(手動では閉じるのでWM_CLOSEは当然有効)

これはこれで便利かもしれません。GUIアプリでデバッグ中に表示して即座にFreeConsoleしておけば
間違って閉じてしまってもアプリが道連れ終了になりませんし、複数の表示内容を複数の窓で確認できるようになりす。

そうすると、前回、コンソールの閉じるボタンを無効化する処理はそのままだと不便になります。
FreeConsoleする時は、閉じるボタンの無効化を戻しておく方が便利に使えます。
それは閉じるボタンの無効のような 面倒なコードは必要なくて
GetSystemMenu(MyConsoleWhd, True);
とするだけです。

他のコンソール関係のコードを確認したい場合は→
Lazarusでコンソールに出力
タグ:Win11
×

この広告は30日以上新しい記事の更新がないブログに表示されております。