2026-01-01から1年間の記事一覧

メモ:Windowsでアイコンの表示が即座に反映されないとき

%LOCALAPPDATA% をエクスプローラで開く IconCache.db (隠しファイル注意) を削除 Windowsを再起動

メモ:VisualStudioでC/C++のプロジェクトの設定

fopen系の関数を使うと警告が出る プロジェクトのプロパティ→「C/C++」→「プリプロセッサ」で、 「プリプロセッサの定義」に ;_CRT_SECURE_NO_WARNINGS を追加 ソースファイルが UTF-8 だと挙動不審 プロジェクトのプロパティ→「C/C++」→「コマンドライン」…

Spresense ArduinoでAudioClassを使わずにマイクとスピーカ

Spresense ArduinoのAudioClassは便利で高機能ですが、多大なメモリを消費します。詳しくはこちらの記事↓ そこで、AudioClass を使わず、デバイスファイルをioctlで直接叩く方法を試しました。SDKのサンプルコードのdirect_audio_throughが使えそうだったの…

SPRESENSEのメモリ使用について調査

SPRESENSEのArduino環境でマルチコアのプログラムを作成していたところ、メモリ不足でサブコアを起動できない、という事態が発生しました。具体的には、MP.begin(subid) が -12 (= ENOMEM) を返します。ENOMEM とは Out of Memory つまりメモリ不足です。SPR…

SPRESENSE版ウェイクワード検出を改良

【2026/04/07 追記あり】AIスタックチャンのウェイクワード登録/検出処理 (WakeWord.cpp) をSPRESENSEマイコンに移植したやつですが、さらに改良しました。前回の記事↓ 改善点 (1) マルチコア対応 音声のデジタル信号処理をサブコアで実行するようにしました。ただ…

62.3%でDISMコマンドが止まる

Windowsを使用しているとき、急に画面が「your device ran into a problem and needs to restart」と表示された黒い画面になり、再起動することがあった。システムファイルチェックをと、コマンドプロンプトを管理者として実行し、下記コマンドを実行。 DISM…

ドラッグトレイの無効化

最近、Windows11でファイルを画面上中央あたりにドラッグすると、「ここにドロップして共有、移動、またはその他の操作を行います」というなんか邪魔なやつが表示されるようになった。「ドラッグトレイ」というものらしい。無効化するには、「設定」→「シス…

AIスタックチャンのウェイクワード検出をSPRESENSEに移植

AIスタックチャンのウェイクワード登録/検出処理 (WakeWord.cpp) をSPRESENSEマイコンに移植しました。 ハードウェア SPRESENSE拡張ボードのMIC Aチャンネルにエレクトレットコンデンサーマイクを接続。負荷抵抗 2.2kΩでバイアスします。詳細は下記ドキュメントを参…

ARMのCMSIS-DSPライブラリで実数FFT

前回の記事のつづき ESP32ではesp_dspライブラリが利用できるが、ARMではCMSIS-DSPライブラリが利用できる。 使い方 #include <arm_math.h> arm_rfft_fast_instance_f32 S; arm_status status = arm_rfft_fast_init_f32(&S, nfft); arm_rfft_fast_f32(&S, data, data, 0)</arm_math.h>…

実数列を半分サイズの複素FFTにつっこむイディオム

謎のコード ESP32の音声処理のプログラムに次のようなコードがあった。 dsps_fft4r_fc32(data, nfft / 2); dsps_bit_rev4r_fc32(data, nfft / 2); dsps_cplx2real_fc32(data, nfft / 2); dataは音声のサンプル列つまり実数の配列であり、nfft はFFTサイズで…

簡易的なノイズ抑制と発話検出

C++で実装。ただし、音声データは符号付き16ビットPCMとし、ひとまず計算にはfloat型を用いて処理の重さも考慮しないものとします。 ノイズ抑制 (Noise Suppression) 一般的には、窓関数→FFT→ノイズ推定→減算処理→IFFT→重ね合わせ しかしやってみるとなかな…

AIスタックチャンのWakeWord.cppを解読 (2)

前回の続きです。 simplevox::VadEngine デフォルトの設定は下記の通り サンプルレート = 16000 Hz フレーム時間 = 10 msec フレーム長 = フレーム時間 × サンプルレート = 160 サンプル VADモード = レベル0 (レベル0~4, 高いほど判定が厳しい) hangbefore…

AIスタックチャンのWakeWord.cppを解読

AIスタックチャンのウェイクワード検出のソースである WakeWord.cpp をざっくり解読します。 コメントにある通り、ややこしいです。 仕様・用語 サンプルレート: 16000Hz VAD : 音声アクティビティ検出 (人が話していることを検出) MFCC : メル周波数ケプストラム係…

メモ:スタックチャンに関するまとめ (3)

現状はラジコンでしかない センスチャン を、どんなロボットにしていくか。 まずは本家である スタックチャン の機能を調査しました。 Moddable版ファームウェア (ししかわさん版) Renderer: 顔の描画 Driver: モータ等の駆動 TTS: 音声合成 事前生成 : ビルド時に生成し…

メモ:スタックチャンに関するまとめ (2)

以前にもまとめましたが、自分でも整理できてなかったので別の切り口でまとめ直します。 Special Thanks to ししかわ@meganetaaan さん : スタックチャンの原作者 robo8080 さん : AIスタックチャンの作者 タカオ@mongonta555 さん : タカオ版スタックチャンの作者 秋田純一 先生 …

センスチャン基板のSDカードまわりの不具合対応

センスチャンとは? SPRESENSEマイコンを搭載したスタックチャン派生のロボットです。 センスチャン基板とは? センスチャン専用に設計した、SPRESENSEの拡張ボードです。 → 詳細はコチラ SDカードまわりの不具合 センスチャン基板にはSDカードまわりに不具合がありました。 症状 電源オン時…

中国の陶磁器の歴史

青字 : 日本での呼称 / 緑字 : 地域 / 赤字 : 年代 ★: 宋代五大名窯 概要 唐 : 唐三彩 宋 : 白磁 と 青磁 元 : 青花 (染付) 明 : 五彩 (赤絵) 清 : 粉彩 唐 唐三彩 (緑・褐・藍) 北宋 ★汝窯 (河南) : 青磁 ( 「雨過天青」の色 ) ★定窯 (河北) : 白磁 ( クリ…

組込み屋でもアプリがしたい!【形四】 第10局

Webアプリ版の形四アプリをリリースしました。ブラウザ上でプレイできます。 アプリの名前は WebKC としました。 形四とは? 「形四(けいし)」とは、白黒4つのコマで正方形をつくるボードゲームです。 詳しくは下記のWebサイトを参照してください。 「形…

組込み屋でもアプリがしたい!【形四】 第9局

いよいよWebアプリ版の形四アプリを作っていきます。 基本設計メモ 仕様はすでにある C#版アプリ(KCSharp) と同等とする。 画面表示、UI、ファイル入力の処理は JavaScript で記述する。 局面データ、思考エンジン等の内部ロジックは Rust で記述して WebAss…

組込み屋でもアプリがしたい!【形四】 第8局

C#版の形四アプリがひとまずリリースできたので、次はWebアプリ版を作りたいと思います。Webアプリ版はJavaScriptとRustで作成します。画面表示やUIなどはJavaScriptで、思考エンジンなど内部のロジックはRustで記述します。いずれもC#のソースを移植する形…

組込み屋でもアプリがしたい!【形四】 第7局

無駄なメモリ消費を低減 画面を更新するたびに無駄にBitmapオブジェクトを生成してメモリ使用量が増大していたのを、最初に生成したBitmapオブジェクトを使い回すように修正しました。 アルゴリズムの最適化 無駄に同じ計算を繰り返している箇所のメモ化や、…

組込み屋でもアプリがしたい!【形四】 第6局

UIの機能追加とバグ修正 本家の「形四96番勝負」とほぼ同等となるように機能を追加しました。 具体的には「戻る」/「進む」ボタンの追加と、大パンチ/大ピンチの表示、および96番勝負のデータです。 KCSharp ver 0.6 機能追加 戻る/進む ボタンを追加 大パン…

メモ:Visual Studioで処理の重い箇所を特定

(1) 分析したい範囲の始めと終わりにブレークポイントをはる。 (2) デバッグ実行を開始する。 (3) 始めのブレークポイントで一時停止。 (4) 「診断ツール」の「記録の開始」をクリックしてから実行を再開する。 (5) 終わりのブレークポイントで一時停止。 (6…

組込み屋でもアプリがしたい!【形四】 第5局

ビットボード これまで盤面の状態を表現するのに5×5の2次元配列を使ってきましたが、ビット演算で扱うように変更します。石の有無を1ビットで表せば彼我の石の位置は各々25ビットの整数で表現できます。実際にはUInt32型の変数を2個使うことになります。局面…

メモ:C#で共用体のようなもの

using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Explicit)] public struct Point { [FieldOffset(0)] public byte x; [FieldOffset(1)] public byte y; [FieldOffset(0)] public UInt16 raw; } class Program { public stat…

C#のclassとstructの挙動の違い

classは参照型だけどstructは値型だということに注意。classはnewしないと実体が無いが、structはnewなしで実体を持つ。代入すると、classでは参照がコピーされるので同一の実体を指すが、structでは値がコピーされるので別々の実体となる。 using System; c…

組込み屋でもアプリがしたい!【形四】 第4局

「オメーの読みは『浅い』んだよ。手当たり次第に読んでくからムダ読みが多い。読みの量は多いが、そのほとんどがゴミだ」 (白鳥 士郎 『りゅうおうのおしごと!』 5巻) アルファ・ベータ法 読みの探索アリゴリズムをミニマックス法からアルファ・ベータ法…

組込み屋でもアプリがしたい!【形四】 第3局

評価関数の改良を試みましたが、残念ながらあまり勝率は変わりませんでした。 本家の「形四96番勝負」アプリと手動で対戦させて評価するため、96番勝負のうち1番から10番の初期配置を選択できるようにしました。勝率はほぼ互角ですが、本家のほうが思考が高…

組込み屋でもアプリがしたい!【形四】 第2局

アルゴリズムを改良していく前に、いったんソースを整理し、アプリの機能と内部構造をきちんと整えました。 所要時間は5時間ほど。 KCSharp ver 0.2 機能追加 決まり手のハイライト表示 石の選び直しを可能に うろうろ禁止ルールチェック リファクタリング R…

メモ:GitHubのタグとリリース

例として、v0.2 というリリースを作成する。 ローカルのリポジトリにタグを付けてプッシュ git tag -a v0.2 -m 'version 0.2' git push origin v0.2 GitHubでリリースを作成 リポジトリの画面の右側にある tags をクリック。 v0.2 というタグができている。 …