2024年10月 3日 (木)

SSSRC( スーパーサンプリング・サンプリングレートコンバータ ) ソフトウェア公開

SSDACのPCアプリによる実装について、これまで次の記事で説明してきました。

SSDACをパソコン上のPythonで実装する ①

SSDACをパソコン上のPythonで実装する ②

これらの記事では、SSDACの目的や原理について説明し、
新たな発見として、スーパーサンプリングによってアップサンプリングしたwavデータは、一般的な市販品のオーバーサンプリングDACで再生しても新たにプリエコー、ポストエコーが発生しない、ということがわかりました。

ソフトウェアでスーパーサンプリングを行うことは、スプライン関数によって補間データを追加してファイルを生成していることから、スプライン関数補間によるサンプリングレートコンバートを行っているということになりますから、入力がCDフォーマットの44.1kHz16bitフォーマットの出力ファイルは、たとえば88.2kHz24bit(2倍スーパーサンプリング)、176.4kHz24bit(4倍スーパーサンプリング)という具合になります。

前回の記事では、88.2kHzサンプリング音源でプリエコー、ポストエコーが発生したとしても、その周波数は44.1kHzなので、聴感上の悪影響はほとんどないであろう事を予想していましたが、実際の検証では、スーパーサンプリングでアップサンプリングしたデジタル信号は、その後オーバーサンプリングDACで処理しても、プリエコー、ポストエコーが発生しない、という意外な結果を得ました。

また、前回までPC上のプログラミング言語Pythonを使ってスーパーサンプリングを実装し検証しましたが、Pythonはインタープリタ言語(逐次翻訳型言語)であることから非常に処理が遅く、15秒の音楽ファイルを処理するのに数時間かかるという具合で、およそ実用的ではありませんでした。

そこで今回は、wavファイルをスーパーサンプリング処理して同じくwavファイルで出力する、サンプリングレートコンバータ、名付けて、
スーパーサンプリング・サンプリングレートコンバータ(SSSRC)をC#コンパイラで実装しましたので、次の通り公開します。

今回作成したSSSRCソフトの仕様は次の通りです。

入力フォーマット : 44.1kHz 16bit (CDフォーマット)
出力フォーマット : 88.2kHz、176.4kHz、352.8kHz、705.6kHz(いずれも24bit)


●ダウンロードと使い方
このソフトはwindows10またはwindows11上で動作します。

ダウンロード - sssrc.zip

SSSRC.zipをダウンロードして任意の場所に解凍したら、SSSRC.exeをダブルクリックして実行します。
このとき、.NETのランタイムがインストールされていないと、次のようなエラーが出ることがあります。

Sssrcnet1
図1..NETランタイムがない場合のエラー

この場合は”Download it now”をクリックして、.NETランタイムをインストールしてから、あらためてSSSRC.exeを実行してください。


●使い方
図2はSSSRCの起動画面です。

Sssrc
図2.SSSRC起動画面


使い方は簡単で、希望するスーパーサンプリング倍率(Super Sampling Ratio)を選んで、変換したいwavファイル(44.1kHz16bitのみ)を、この画面上にドラッグ&ドロップすると、元のwavファイルと同じ場所に”SS_OUTPUT”ホルダが生成され、その中にアップサンプリングされたファイルが生成されます。複数ファイルを一括してドラッグ&ドロップすることができます。
変換時間は、私の古いパソコン(第5世代Corei7(2core)、メモリー16GB、windows11)で、4分(約40MB)のwavファイルを88.2kHzに変換するのに35秒、705.6kHzに変換するのに1分30秒かかりました。

実際にこのソフトで処理した信号の波形を見てみましょう。代表例として、1kHzの方形波と正弦波を4倍スーパーサンプリングでアップサンプリングした場合の波形を図3、図4に示します。

1korg
図3.元波形(44.1kHz16bitサンプリング)


1k4x
図4.4倍アップサンプリング波形(176.4kHz24bitサンプリング)

以上のように、スプライン関数による補間によりアップサンプリングしたファイルが出力されます。

ここで注意したいのは、出力ファイルの容量です。アップサンプリング倍率に加えて、ビット分解能が16bit→24bitと1.5倍となることから、
出力ファイルはアップサンプリング倍率x1.5倍の容量になります。
たとえば長さ4分で約40MBのwavファイルは、2倍アップサンプリングでは3倍の120MBに、16倍アップサンプリングでは24倍の960MBになりますので、ストレージを圧迫します。要注意です。

今後、今回のSSSRCで元ファイルをアップサンプリングして通常のDACで再生したものと、元ファイルをそのまま通常のDACで再生したもの、また、元ファイルをハードウェアのSSDACで再生したものの違いについて聴き比べと検証を行う予定です。


| | | コメント (0)

2024年9月27日 (金)

SSDACをパソコン上のPythonで実装する ②

【今回の結論】
・WAVファイル再生時の前処理として、スーパーサンプリングを応用したアップサンプリング処理をしておけば、通常のオーバーサンプリングDACによる再生においても、プリエコー、ポストエコーによる音質への悪影響をSSDACと同程度に軽減できる。


前回の記事では、Windows上でPythonを使ってSSDACを実装し、補間の様子をグラフで確認しました。
今回はPythonで実装したSSDACで、実際のWAVファイルを処理して、結果を同じくWAVファイルで取り出し、効果を確認、検証します。

なお今回も前回に引き続き、PythonによるSSDACの実装コードを公開します。今回は任意WAVファイルに対して、任意のスーパーサンプリング倍率処理を施したWAVファイルを出力するもので、名称はSSSRC(スーパーサンプリング・サンプリングレートコンバータ)です。

SSDAC(スーパーサンプリングD/Aコンバータ)の目的は何かというと、過渡的な信号を再生する際に、従来から行われているオーバーサンプリングで原理的に発生するプリエコー、ポストエコーというノイズを抑えることです。

図1に、一般的なDACデバイスを使用して過渡的な信号を再生した場合の典型的なプリエコー、ポストエコー発生の様子を、図2にSSDACを使用してプリエコー、ポストエコーが抑えられた波形を示します。

Ess_20240926181001
図1.ESS9018K2Mによるポストエコー、プリエコー


Tek0053_20240926181001
図2.スプライン関数補間により、プリエコー、ポストエコーが抑えられる


図1に示すように、従来のオーバーサンプリングデバイスではプリエコー、ポストエコーが発生し、その周波数はサンプリング周波数の半分です。たとえばCD音源の場合はサンプリング周波数が44.1kHzなので、プリエコー、ポストエコーの周波数は22.05kHzです。ヒトの可聴周波数帯域は20kHz上限といわれていますから、22.05kHzのノイズが直接聞こえることはないと思われますが、CDには20kHzまでの信号が記録されていて、たとえば記録上限の20kHzの音が再生されたとき、これが22.05kHzのプリエコー、ポストエコーと干渉して、その差分すなわち2.05kHzのビートが発生する可能性があります。このようにプリエコー、ポストエコーが発生すると、音源に含まれるすべての周波数帯域との間でビートが発生することになり、これが聴感に影響を与えます。
このようなことが起こらないように、プリエコー、ポストエコーの発生を抑えつつデータ補間を行う事を目的に考案されたのがSSDACで、同じ過渡的な信号をSSDACで再生すると、図2に示すようにプリエコー、ポストエコーが抑えられます。

ところで、上に述べたプリエコー、ポストエコーは、22.05kHzという、再生周波数上限の20kHzに近い周波数で発生することによって聴感に悪影響を与えますが、プリエコー、ポストエコーの周波数が十分高ければ、具体的にはたとえば44.1kHz、あるいはそれよりも高い周波数であれば、もし発生しても聴感上の影響はかなり小さくなるだろうと思われます。それはつまり、音源のサンプリング周波数が88.2kHzまたは96kHz以上であれば、プリエコー、ポストエコーの周波数は44.1kHzまたは48kHz以上となり、聴感への悪影響は些少であるということです。

そうすると、44.1kHzサンプリングのCD音源信号を、88.2kHzサンプリングに変換してから通常のDACで再生すれば、プリエコー、ポストエコーの影響は無視できるのではないかと考えられます。
それならばSRC(サンプリングレートコンバータ)であらかじめサンプリングレートを88.2kHzに変換しておけばよいのではないかということになりますが、これでは意味がないのです。なぜなら、SRCの原理はオーバーサンプリングと同じで、インターポーレーション後にFIRフィルタ処理を行うため、SRCの行程でプリエコー、ポストエコーが付加されてしまうからです。

そこで、2倍のスーパーサンプリング、つまりスプライン関数でデータ間1点の補間を行えば、プリエコー、ポストエコーの発生を抑えた2倍アップサンプリングが可能で、この2倍アップサンプリングデータを通常のDACで再生すれば、プリエコー、ポストエコーの影響が些少な再生が可能であると考えられます。

以上のような考察に基づいて、以下の検証を行います。

【使用音源】
a. 1kHz方形波をCDフォーマット(44.1kHz16bit)で録音したWAVファイル→元音源
b. 元音源を2倍スーパーサンプリングによってアップサンプリングしたもの→2XSS音源(88.2kHz32bit)

【評価内容】
①元音源をソフトウェア(TASCAM Hi-Res Editor)によって352.8kHz32bitにアップサンプリング
②2XSS音源をソフトウェア(TASCAM Hi-Res Editor)によって352.8kHz32bitにアップサンプリング
③上記①、②の再生波形において、プリエコー、ポストエコーの発生を比較

【評価結果】
まずは図3に元音源(1kHz方形波44.1kHz16bit sampling)の波形を示します。
ここでは補間の様子がわかりやすいように、すべての波形はデータの散布図として表示します。波形の表示にはaudacity2.4.2を使用しました。

Sq1k_org
図3.元波形(1kHz方形波 44.1kHz16bit)

この元波形を、TASCAM Hi-Res Editorを使用して352.8kHz32bitにアップサンプリングしたものを図4に示します。

Sq1k_352
図4.352.8kHz32bitにアップサンプリング


図4では、プリエコーポストエコーが発生しているのがわかります。これは一般的なDACデバイスによってオーバーサンプリング再生を行った場合と等価な結果です。


次に、元波形に対して今回作成したpythonによるSSSRCを使って2倍のアップサンプリングをした波形を図5に示します。

Sq1k_ss2x
図5.SSSRCによる2倍アップサンプリング波形

スーパーサンプリングによる補間によって、立ち上がり前後でオーバーシュートが発生する典型的な波形になっています。これは図2で示したSSDACによる波形と等価です。
これは元の波形のフォーマットを44.1kHz16bitから88.2kHz32bitにアップサンプリングしたものであると考えることができます。

次にここで得られた88.2kHz32bitサンプリングの信号を、TASCAM Hi-Res Editorを使って352.8kHz32bitサンプリングにアップサンプリングした波形を図6に示します。

Sq1k_ss2x_352
図6.SSSRCで2倍アップサンプリングしたものを、352.8kHzにアップサンプリングしたもの

これは興味深い結果で、44.1kHzのプリエコー、ポストエコーが新たに付加されることを予想していましたが、予想に反して新たなプリエコー、ポストエコーは付加されず、SSSRCによる2倍アップサンプリングの波形(エンベロープ)がそのまま出てきました。

つまり、SSSRCで前処理として2倍アップサンプリングしておくことによって、一般的なオーバーサンプリングDACデバイスにる再生においてSSDACと等価な結果が得られるのではないか?ということです。

もちろん前処理は2倍に限らず任意のアップサンプリング倍率を選ぶことができますが、ソフトによる処理では倍率が高くなるほど処理時間が増加し、生成されるファイルが大きくなります。
今回のSSSRCでは、5秒のWAVファイルを2倍アップサンプリングするのに1分40秒かかりました(^-^;


【SSSRC(スーパーサンプリング・サンプリングレートコンバータ)ソースコード】
今回もPythonによりコードを作成したので公開します。
コードの内容は前回発表したSSDACの実装とほとんど同じで、今回は補間してできあがったデータをWAVファイルとして出力する部分を追加しました。

ダウンロード - 20240924python_ssdac101.py

興味のある方はダウンロードしてご覧ください。
以下は要点です。

19行目
data_dir = 'C:\\Local_Files\\Python'
これは加工する元WAVファイルの格納ディレクトリです。

20行目
fname = '1k_1s.wav'
加工するターゲットファイルです。

26行目
ss_ratio=2 #スーパーサンプリング比
スーパーサンプリング倍率を設定します。2^nの数値を設定します。上限はありませんが、大きくするほど仕上がりのファイル容量は大きくなります。

75行目
wavfile.write(fileName, samplerate*ss_ratio, (y_all*47662).astype(np.int32))
演算したデータをWAVファイルに書き込みます。ファイル名は演算開始時刻にしており、できあがったWAVファイルの生成時刻との比較により演算に要した時間がわかります。
y_allは16bitフルスケールの整数からfloatで計算しているため、これを32bit整数に拡張してファイル出力します。スーパーサンプリングによる補間によって、信号ピークは最大1.375倍になるので、65536/1.375=47662を乗じて、フルスケールになるように調整します。

78行以降
グラフ表示部分をコメントアウトしています。

※できあがりのWAVファイルは、このソースファイルと同じディレクトリに生成されます。


【今後の予定】
今回のPC上のPythonによる実装では、多大な処理時間がかかり実用的ではないため、C#などのコンパイラによる実装で処理時間を短縮し、より実用的なものにしたいと思います。


そういうわけで、ソフト処理によってより簡単にSSDACの効果を体感できるということがわかりましたので、より多くの方々にSSDACの音を楽しんでいただきたいと思います(^-^)

【おまけ】
今回公開したPythonのファイルはWindowsパソコン上で実行できます。
もっとも簡単な方法は、Anaconda3をインストールして、同梱のSpyderを起動、pyファイルを読み込んで実行ボタンを押せば実行できます。
Anaconda3はこちらからメールアドレスを入力すればダウンロードできます。
実行結果にグラフが含まれる場合は、Spyderの右上窓のPlotsタブに表示されます。
コマンドラインでのPython実行は右下窓で実行できます。
Pythonが初めての方もぜひ遊び感覚でいじってみてくださいね(^-^)

| | | コメント (0)

2024年9月20日 (金)

格安タブレット TECLAST P85T の不具合と対処方法

20240920p85t

Amazonで格安タブレット TECLAST P85Tが9500円ほどで売られていたので購入した。
ところが使ってみると、スクショが撮れないという不具合が発覚し、返品、買い直しなどを経て、最終的にはファームウェアアップデートによって解決したが、最初の購入から問題解決まで1ヶ月以上を要してしまった。その顛末を書いておく。

そもそもスマホは使わない主義なので、携帯電話は二つ折りのガラケー(正確にはガラホ)を使っていて、ネット閲覧やメール用にタブレットを持ち歩いている。それはなぜかというと、スマホの小さな画面を見るのはつらいし操作がしにくいということ、それと電話とネットが一緒になっているスマホの通信料金体系がわかりにくく、割高になるような感じがするからだ(もしかしたら最近は格安SIMなどでかなり安いのかもしれないが)。

ぼくにとってタブレットは2年から3年で買い換える消耗品の扱いなので、だいたい1万円~1万3千円程度までのものを買うようにしている。ストレスなくメールができてネットブラウジングができるだけでいいので、それほど高性能なものは必要がないのだ。
タブレットのいちばん大きな問題は、だいたい3年もすれば電池が寿命になることで、多くのタブレットはユーザーが自分で電池交換できるように作られていないので、ここでタブレットを買い換えるか電池交換に出すか、ということになる。電池交換は、交換業者に出すか、メーカーに出すかということになるのだが、電池交換費用は安い業者で最低1万円、国内メーカーに出すと2万~3万円かかる。
またタブレットは持ち歩くので、落として壊してしまうこともある。
そう考えると、平均して2~3年しか使えない消耗品にいくら出せるか?ということになり、ぼくとしては1万円台前半のタブレットを使い捨てるのが妥当だと考えている。

そんなわけで、2024年7月に、それまで使っていたタブレットが壊れてしまい、タッチスクリーンの左側が反応しなくなってしまったので、買い換えを検討したところ、AmazonのタイムセールでTECLASTのP85Tという機種が9500円程度で売られていて、値段的にもスペック的にもよさそうだったので購入した。ケースは金属でできていて塗装もきれいで高級感があり、満足して使っていたが、使い始めて間もなく不具合を発見した。システム機能のスクリーンショットが使えないのだ。

スクリーンショットのボタンをタッチすると、「システムUIが繰り返し停止しています」というエラーが出て、スクショが撮れないばかりか、勝手に再起動してしまう場合すらある。

TECLASTのホームページからサポートにこの問題を報告したところ、ファームウェアのアップデートをするように、という内容の返信が来たので、ファームウェアのダウンロードサイトを見に行ったが、該当製品ID”P3M5”のファームウェアが上がっておらず、そのように指摘すると、何日かしてファームウェアがアップされていた。このときのファームウェアバージョンはROW_V1.01_20240618というもので、これでやっと解決する!!と嬉々としてダウンロードしてアップデートしたが、問題は解決しなかった。バージョンをよくよく見ると、もともと入っていたファームウェアバージョンと同じであった。そこでまたサポートに報告すると、返金に応じるので返品してくれということだった。

この機種はスクショの問題以外は文句はなく、気に入って使っていたし、同じ価格帯の機種がなさそうだったので、できれば直して使いたかったのだが、ひょっとしたら個体の不具合なのかもしれないと淡い期待を抱いて返品し、返金されたので再度同じものを購入したが、まったく同じ不具合が出た。そこでまたサポートに不具合報告と、改善の予定があるのか問い合わせてみたが、返品してくれの一点張で、らちがあかないので、そのうちファームウェアでの改善があるであろう事を期待して、しばらく使っていた。

それから2週間ほど経ったある日、ファームウェアのダウンロードサイトをのぞいたら、新しいファームウェアがアップされていた。バージョンはROW_V1.02_20240724。今度こそ!!と期待を込めてアップデートしてみたら、スクショが撮れるようになった\(^o^)/

そんなわけで、無事にまともに使えるようになったのだった。
ところで、ファームウェアのダウンロードサイトには
ROW_V_x.xx
EEA_V_x.xx
という2種類のファームウェアがアップされていて、何がちがうのかと思ったら、EEAは欧州向けで、ROWがグローバル版らしいのだが、違いはよくわからない。もともとROWが入っていたので、アップデートもROWにした。

ファームウェアアップデートの具体的な方法は、サイトの説明を参照してほしいが、ひとつだけ注意してほしいことは、アップグレードチュートリアルの説明では、ファームウェア書き込み時に”Wipe part”を選択するように書かれており、この通りにやると、すべてのインストールアプリとデータが削除されてしまう。アプリとデータを残してファームウェアだけアップデートするには”Wipe part”ではなく”Keep data”を選ばなければいけないので要注意だ。

今回問題となったスクリーンショットの機能は、おそらく使う人があまり多くはないため見落とされていたのだろうと思うが、ぼくは詰め将棋のアプリで難しい問題があったときにスクショを取っておくようにしていることから、今回の問題に気が付いた。

問題が解決した今はお気に入りのタブレットになりました。ブルーの筐体を選んだので、カバーをピンクにしたら、映えてなかなかよい感じです(^-^)


| | | コメント (0)

2024年9月 6日 (金)

EOS MとAi Nikkor 50mm f1.8

 2012年に購入したEOS Mを久しぶりに引っぱり出して、さらに30年近く前に買ったAi Nikkor 50mm f1.8を装着して、散歩がてら街の写真を撮ってきた。
ネットで誰か(おそらくプロの写真家の方)が、今のデジカメに昔のレンズを付けて撮るのがなかなか良いとつぶやいていらしたので、なるほどと思い真似してみたのだ。

なぜEOSにNikkorなのかというと、もともとフィルム時代はNikon F3ユーザーで、レンズも数本もっていたのだが、懸賞でEOS M用のタムロンズームレンズが当選したので、そのレンズ用にEOS Mを買ったというのが事の経緯だ。とはいえ、サブ機として頂き物のCANONのAE-1と数本のレンズももっていて、どちらかといえばAE-1に使っていたレンズをEOSにつける方が筋が通っているように思うが、F3用の50-200mmのズームをもっていて、これとテレコンとEOS Mで月の写真を撮ってみたいと思い、EFレンズとAi Nikkorのアダプタを買ってもっていたからだ。

そういうわけで、EOS MにNikkorを装着するとこんな感じになる。

Eosnikkor
写真1.Ai Nikkor 50mm f1.8を装着したEOS M

この通り、レンズの存在感がすごい(^-^;
EOS Mがとてもコンパクトなのが際立つ。

出かける前に、部屋の中やベランダでテスト撮影してみた。

Bungu
写真2.ペン立て

Kitchen
写真3.キッチン

Asagao
写真4.あさがお

まったくなんでもないペン立てやキッチンも、良い機材で撮るとなんだかドラマチックな感じがする(^-^)

35mmカメラでの50mmレンズは、APS-CサイズのEOS Mでは1.5倍の75mm相当になるので、ふだん広角のコンデジに慣れているとずいぶん望遠気味な印象になる。ズームで調整はできないので、足で距離を調整するしかない。

どうやら写真はちゃんと撮れるようなので、街に出てみた。


Sarusuberi1
写真5.日影の百日紅


Kinomi
写真6.ヤブカラシ


Hibiscus
写真7.ハイビスカス


これらは近所の図書館までの道で見た光景だ。オートフォーカスが使えないのでマニュアルでピント合わせをするのだが、外の明るさでカメラの液晶を見てピントを合わせるのはなかなか難しい。老眼なのでなおさらだ(^-^;
全体的にピントが甘めになってしまった……
でも、ピントを合わせて、バシャン!!とシャッターを切ると、そうそう!こういう感じだった!!という思いがよみがえる(^-^)


Library
写真8.図書館の建物


Komorebi
写真9.木漏れ日


Hibiscus2
写真10.ハイビスカス2


そういうわけで、図書館まで散歩して写真を撮って帰ってきた。
機材が良いとずいぶんドラマチックに撮れるものだ。

でも実際に目で見る光景こそがドラマそのものである、というのが真実なので、
見慣れた光景にも注意を向けて、いつも何かを感じ取れるように過ごしていけたらいいなあ、と思います。


| | | コメント (0)

2024年9月 5日 (木)

aliexpressで購入したCP2112欠陥基板

SiliconLabsのCP2112というデバイスがある。これを使うとマイコンの介在なしに、パソコンのUSBポートから、C#などのコードを使って直接I2CデバイスやGPIOの制御ができる。このデバイスとUSBコネクタとピンヘッダが搭載された基板が販売されている。

サンハヤト

Amazon

AliExpress

この中でサンハヤト製がいちばん信頼が置けそうだが少しお高めだ。アマゾンで売っているものはサンハヤトの半額以下で、お試しに購入するにはよさそうだが、アリエクではさらにその半額に近い値段で、しかもUSB-Cのものがあるので、アリエクのUSB-Cのものを3つ購入した。

テスト用のアプリは、本家SiliconLabsのサイトから、
Legacy: CP2112 Software Development Kit for Windows XP and Vista
をダウンロードして使う。XP and Vistaと書いてあるが、windows11でも使えるようだ。
また、上のサンハヤトのサイトからは、C#で書かれたサンプルプログラムが入手可能だ。

さっそくSiliconLabsのテストアプリをつかって、とりあえずGPIOのON/OFF動作を見てみたが、どうも様子がおかしい。
動いているようではあるのだが、ハイレベルが2Vちょっと、ローレベルがマイナスになったりしていて、しかもすごいノイズが乗る。
電源のラインをみると、これも2Vくらいしかなく、どうも様子がおかしいので、回路を追ってみたところ、なんとGNDパターンがGNDにつながっていない(^-^;
写真1のように、GNDをジャンパ線で接続したら正常に動作するようになった。写真2は基板裏面の様子。

Cp2112_a
写真1.GNDジャンパ接続の様子

Cp2112_b
写真2.基板裏面

このデバイスは、I2CのほかにGPIOが8本使えるが、この基板のシルクを見るとGPIOはIO5~IO7の3本しか出ていないように見える。
回路を追ってみると、IO0とIO1は基板上のLEDに接続されていて、外部には引き出されていない。IO0とIO1はそれぞれTxToggleとRxToggleという機能が使えるようになっており、これは通信時のデータアクセスランプとして使う機能のようだ。IO2~IO4はどうなっているかというと、それぞれMAK、INT、RSTのシルクの端子に接続されていた。つまりIO2~IO7は外部に引き出して使うことができる。デバイスのRST端子は4.7kでプルアップされていて、外部には出されていない。

そういうわけで、どうやら無事に使えるらしいことがわかった。
アリエクはまあ、こういうことが時々あって、やれやれ、という感じだ……(^-^;

| | | コメント (0)

2024年7月15日 (月)

SSDACをパソコン上のPythonで実装する ①

この記事では、これまで紹介してきたSSDACを実際にパソコン上のPythonで実装し、デジタルデータをスプライン関数で補間するという作業をご理解いただきたいと思います。

今回は、まずは簡単な信号を録音したCDと同じ44.1kHz16bitのWAVファイルを読み込んで、任意のスーパーサンプリング倍率でスプライン補間した場合の波形をシミュレーションします。

最終的にはPythonで実装したソフトで、CDのデータをスプライン関数補間によってSRC(サンプルレートコンバート)したファイルを出力し、疑似ハイレゾファイルとして再生できるようにしたいと思います。

なおこの記事を書くにあたっては、スプライン関数を導出するための公式を使っています。スプライン関数の公式の詳細な説明は次の文献をご参照ください。

トランジスタ技術2018年10月号記事

電気学会論文 ECT-17-058-3

電子情報通信学会論文  ICD2017-28


1.なぜスプライン関数で補間したいのか
オーディオDACでは通常、オーバーサンプリングという技術でデータ補間を行っています。これはごくおおざっぱに言うと、上限周波数20kHzに対してサンプリング周波数が44.1kHzでは粗いので、補間してなめらかにしてから再生するということです。また、このときオーバーサンプリングによって量子化ノイズやエイリアシングノイズの周波数を高域に追いやることで、ポスト・ローパスフィルタの設計が楽にできるというという大きな利点があります。
通常、オーバーサンプリングは、データに対して補間点に0値の点を挿入(インターポーレーション)して、FIRフィルタを通すことで実現していますが、ここで使われているFIRフィルタには、過渡的な再生信号に対してプリエコー、ポストエコーと呼ばれるノイズが発生するという、宿命的な欠点があります。図1に示すように、ポストエコー、プリエコーはサンプリング周波数の半分、たとえばCDだと44.1/2=22.05kHzで発生します。
それでは、プリエコー、ポストエコーの発生を抑えつつ補間する方法はないか?ということで考案されたのが、スプライン関数による補間です。図2に示すように、スプライン関数による補間では、プリエコー、ポストエコーが大幅に抑えられているのがわかります。
これこそが、SSDAC最大の利点なのです。

Ess
図1.ESS9018K2Mによるポストエコー、プリエコー

Tek0053
図2.スプライン関数補間により、プリエコー、ポストエコーが抑えられる


2.なぜこれまでスプライン関数補間によるDACがなかったのか
飛び飛びの点をなめらかにつなぐために、たとえばEXCELでは包絡線の機能があり、これはスプライン関数によるものです。離散的な点をスプライン関数でつなぐ、という発想はごく当然なものです。それではなぜこれまでデジタルオーディオで応用されなかったのでしょうか。

スプライン関数を正確に計算するためには、開始点と終止点が確定していることが必要条件です。たとえば音楽再生で考えると、スプライン関数を計算するためには、ある曲が始まってから終了するまでのすべてのデータを使って演算する必要があるのです。そうすると、データを一曲分先読みしておいて、スプライン関数をすべて計算してから再生するということになり、再生ボタンを押してから再生開始まで、スプライン関数の演算時間を待たなければなりません。短い曲ならいいかもしれませんが、長い曲ほど演算に時間がかかります。また早送りなどをして途中から再生したい場合などには、全体を通して再生する場合とスプライン関数の演算結果が違ってしまうなどの不都合が生じます。
SSDACでは、これらの問題点について数学的なアプローチで解決することに成功しました。

3.どのように解決したのか
いま、CDからデジタル信号が入力しているとして、これは44.1kHz16bitのサンプリングなので1/44100≒22.68μsごとに-32768~32767までのいずれかの値を持つデータが1個(ステレオだと2個)送られてきますから、これをアナログの値に変換するのがD/Aコンバータの仕事です。-32768~32767の値を持ったデータは、D/Aコンバータの仕様によって、たとえば0V~2Vとか、±2.5Vとかの範囲の電圧に変換されて出力されます。

今現在D/A変換している生データをD0として、ひとつ未来の生データをD+1、n個未来の生データをD+n、ひとつ過去の生データをD-1、n個過去の生データをD-nというように、現在の生データD0を中心に、データに番号を振っておきます。

スプライン関数でデータを補間するとは、具体的には現在の生データD0から1個未来の生データD+1までの間を、

Shiki1・・・・・①

という3次関数でなめらかにつなぐということです。この式のd0は現在の生データD0です。
このときxの変域は

Heniki

であり、式さえ求まってしまえば、あとはxを細かくステップすればするほどなめらかな補間ができます。
この式でx=0のときはy0=d0=D0、つまり現在の生データ、x=1のときは1個未来の生データD+1となります。

それでは、スプライン関数の公式を使って、式1を決定するやり方を見ていきましょう。式①を決定するとは、各係数a,b,cを決定することです。

まず式①で、x^2の項の係数bを求める公式は、


Bj・・・・・②

djは入力された生データです。e,fは次式で与えられます。

En・・・・・③

Fn  ・・・・・④

ここで、αは、

Alpha

という定数です(これは発明者の小林芳直氏によってIS(Infinite Spline)定数と名付けられました)。

上記式③、④および定数αが、SSDACでスプライン関数の計算が可能になった最大のキモなので、以下に簡単に説明します。

スプライン関数の計算を実装可能にしたのは、このαという定数の発見と、それに伴い計算の打ち切り条件が算出されたことです。
これらは上述のトランジスタ技術2018年10月号にて詳しく解説していますので、ここではごくおおざっぱに説明します。
まず、現在の生データとひとつ未来の生データの間を補間するスプライン関数に与える前後の生データの影響は、1つ未来または1つ過去に遠ざかるにつれて、αを乗じた分だけ影響度が低下してゆく、ということが発見されました。つまり、式③、式④にて示されるように、ひとつ過去また未来の生データの影響度はα倍、2つ過去または未来の生データの影響度はα^2倍・・・n個未来の過去または未来の生データの影響度はα^n倍となっています。αはおよそ-0.26ですから、2乗、3乗、4乗……と乗じるごとにどんどん小さくなっていきます。
さて、式③、式④では未来または過去に13個離れた生データまでで打ち切られています。これはどうしてかというと、これらの式はデータ精度を24bit出力として得る場合のものなのですが、13個より遠い生データが現在のスプライン関数の演算結果に与える影響は24bit精度以下になるので14個目以降の生データを打ち切ることができる、ということを示しています。
どこで打ち切っていいのか、ということは、希望する出力のbit精度によって違い、次のようになります。

16bit・・・・・未来過去それぞれ9個の生データまでで、10個以降は打ち切り
24bit・・・・・未来過去それぞれ13個の生データまでで、14個以降は打ち切り
32bit・・・・・未来過去それぞれ17個の生データまでで、18個以降は打ち切り

つまり、得たい出力ビット数に応じて、ビット数/2+1までの未来過去までを演算すれば良い、ということがわかったのです。

ここまででスプライン関数のx^2の係数bが計算できたので、残りのaとcを、次の公式を使って求めます。

Aj・・・・・⑤

Cj・・・・・⑥

ここで、djは現在の生データ、dj+1は1つ未来の生データ、bjは先に計算した現在のスプライン関数の係数b、bj+1は1つ未来のスプライン関数の係数bです。

これで、現在の生データから1つ未来の生データまでを補間するスプライン関数が求まりました。

4.PC上のPythonで実装する
それでは以上に述べたスプライン関数によるデータ補間を、実際にPythonで実装してみましょう。
ここでは、CDと同じ44.1kHz16bitサンプリングのWAVファイルのデータを、スプライン関数によって補間し、補間前後の波形をグラフで表示して比較する、ということを行います。
まず筆者の作業環境ですが、windows11にAnaconda3をインストールするとJupyter Notebookが自動的にインストールされるので、これを使っています。

Jupyter Notebookを起動すると、ブラウザ上にjupyterのHomeが起動するので、ここで作業を行います。画面右上のNewのプルダウンからNotebookを選ぶと、新しくNotebookが開きますので、ここのコード入力窓にコードを入力して最終行末尾にカーソルを持って行ってshift+Enterすれば実行されます。
Pythonを使い慣れた人はanacondaに付随しているSpyderを使う方が便利かもしれません。
次のコードの下にソースコードのダウンロードリンクを張っておきます。

以下に、今回Pythonで作成したSSDACのコードを示します。

##############ここから#################################
from os.path import dirname, join as pjoin #文字列接続メソッドjoinのインスタンス定義
from scipy.io import wavfile
import scipy.io
import numpy as np

import matplotlib.pyplot as plt
from scipy.io.wavfile import read

data_dir = 'C:\\MyData\\Python'
fname = '1k_5ms.wav'
wav_fname = pjoin(data_dir, fname)

alpha=-2+3**0.5 #IS定数
ss_ratio=4 #スーパーサンプリング比

samplerate, data = wavfile.read(filename=wav_fname)

#24bit精度でスプライン関数を計算するため、データの先頭と末尾に(24/2)+1=13個の計算用ダミーデータを追加する。
padding_array = np.array([[0, 0], [0, 0], [0, 0], [0, 0],[0, 0], [0, 0], [0, 0], [0, 0],[0, 0], [0, 0], [0, 0], [0, 0],[0,0]])

data=np.vstack((padding_array,data)) #data先頭にダミーデータ13個追加
data=np.vstack((data,padding_array)) #data末尾にダミーデータ13個追加

#ファイル全体分のインパルスe,fの空の配列(L,R)を用意する
e = np.zeros(shape=(len(data),2))
f = np.zeros(shape=(len(data),2))

#ファイル全体分のスプライン関数のaj,bj,cjの空の配列(L,R)を用意する
aj = np.zeros(shape=(len(data),2))
bj = np.zeros(shape=(len(data),2))
cj = np.zeros(shape=(len(data),2))


#仕上がりデータ
y_all=np.empty((1,2)) #ここで空の配列を作る

#ファイル全体分のインパルスe,fを計算する
for i in range(13,len(data)-13):
      for j in range(0,14):
            e[i]+=(alpha**j)*data[i-j]
            f[i]+=(alpha**j)*data[i+j]

#先頭のe(-1)=0
e[12]=0
#末尾のf(+1)=0
f[len(data)-13]=0

#ファイル全体分のスプライン関数の係数aj,bj,cjを計算する
for i in range(13,len(data)-13):
      bj[i]=-3*(3**0.5-1)*data[i]+3*(2*(3**0.5)-3)*(f[i+1]+e[i-1])

for i in range(13,len(data)-13):
      aj[i]=(bj[i+1]-bj[i])/3
      cj[i]=data[i+1]-data[i]-2*bj[i]/3-bj[i+1]/3

for i in range(13,len(data)-26):
      for j in range(0,ss_ratio):
            y_all=np.vstack((y_all,aj[i]*(j/ss_ratio)**3+bj[i]*(j/ss_ratio)**2+cj[i]*(j/ss_ratio)+data[i]))

#plt.plot(y_all)

x=np.arange(0,len(data),1)
plt.xlim(24,55)
#(24,55)@1k_5ms
#(24,35)@10k_500us
plt.step(x,data[x])
plt.title(fname+" NOS Zoom in")
plt.show()

x=np.arange(0,len(y_all),1)
plt.xlim(220,350)
#(110,170)@1k_5ms_ss2
#(220,350)@1k_5ms_ss4
#(900,1400)@1k_5ms_ss16
#(0,17)@10k_500us_ss2
#(0,34)@10k_500us_ss4
#(0,80)@10k_500us_ss16
plt.step(x,y_all[x])
plt.title(fname+" SS"+str(ss_ratio)+"x"+" Zoom in")
plt.show()

x=np.arange(0,len(y_all),1)
plt.xlim(0,len(y_all))
plt.step(x,y_all[x])
plt.title(fname+" SS"+str(ss_ratio)+"x"+" All over")
plt.show()
########################ここまで########################

ダウンロード - 20240716python_ssdac000.py


今回、コードで使用するための44.1kHz16bitサンプリングの短いWAVファイルを用意しました。これはefu氏によるWaveGeneによって生成したもので、Lチャンネルに方形波、Rチャンネルに正弦波を録音してあります。

ダウンロード - 1k_5ms.wav

ダウンロード - 10k_500us.wav


まず、コードの9,10行目で、WAVファイルのディレクトリとファイル名を設定しています。

data_dir = 'C:\\MyData\\Python'
fname = '1k_5ms.wav'

ここはご利用の環境に応じて適宜変更してください。

次に14行目でスーパーサンプリング比を設定しています。これは現在の生データから次の生データまでの間を何倍のデータで補間するかを設定します。現在頒布しているSSDAC基板では、SSDAC128なら128倍、PCM1704やI2Sデバイスを使ったSSDACは16倍になっています。

ss_ratio=4 #スーパーサンプリング比

66行目以降はグラフ表示の部分で、ここでは入力信号の周波数とスーパーサンプリング比によって適切なズーム倍率で表示されるように、plt.xlimの値を変更する必要があります。これは注釈としてコード中に記載してあるので、適宜変更します。
なお、グラフ表示にあたっては、実際のD/Aコンバータと同じく0次ホールドでグラフを描画しているため、ステップ表示になります。

その他の注意点としては、上で述べたとおり、24bit精度でスプライン関数を計算するために、現在のデータの前後13データが必要になるため、ファイルから読み込んだデータの先頭と末尾に13個の0データを付け加えています(18~22行目)。

それではさっそく実行してみましょう。
まずは1k_5ms.wavを使って、4倍スーパーサンプリングの波形を見てみます。ファイルのディレクトリだけ注意して、あとは上のコードのままでいけるはずです。次のグラフが表示されれば成功です。

1k_5ms_nos
図3.1kHzの方形波および正弦波のNOS(元)データ

1k_5ms_4xss
図4.1kHzの方形波および正弦波の4倍スーパーサンプリングデータ(ズーム)


1k_5ms_4xss_all
図5.1kHzの方形波および正弦波の4倍スーパーサンプリングデータ(全体)


図3が元のデータ、いわゆるNOSでのグラフで、図4が4倍スーパーサンプリング処理をしたものです。
図4ではデータが4倍スーパーサンプリングされて、ギザギザ(量子化ノイズ)が細かくなっている様子がわかります。

次に、同じ1kHzの信号を16倍でスーパーサンプリングした波形を見てみます。
プログラムは、14行目
ss_ratio=16 #スーパーサンプリング比
と75行目
plt.xlim(900,1400)
のように変更します。

1k_5ms_nos
図6.1kHzの方形波および正弦波のNOS(元)データ


1k_5ms_16xss
図7.1kHzの方形波および正弦波の16倍スーパーサンプリングデータ(ズーム)


1k_5ms_16xss_all
図8.1kHzの方形波および正弦波の16倍スーパーサンプリングデータ(全体)


図7を見ると、ほとんど段差が見られないほどなめらかになっています。

次に10kHzの信号ではどうでしょうか。10行目を

fname = '10k_500us.wav'

14行目を

ss_ratio=4 #スーパーサンプリング比

とし、67行目を

plt.xlim(24,35)

75行目を

plt.xlim(0,34)

に変更して実行します。

10k_500us_nos
図9.10kHzの方形波および正弦波のNOS(元)データ


10k_500us_4xss
図10.10kHzの方形波および正弦波の4倍スーパーサンプリングデータ(ズーム)


図9の元データでは、正弦波の面影はなくなってしまっていますが、図10の4倍スーパーサンプリングではかろうじて正弦波が復元されているように見えます。ここでは全体データは図10とほぼ同じくなるため省略します。

次に同じ10kHzの信号を16倍スーパーサンプリングします。14行目を

ss_ratio=16 #スーパーサンプリング比

に変更し、75行目を

plt.xlim(0,80)

とします。

10k_500us_16xss
図11.10kHzの方形波および正弦波の16倍スーパーサンプリングデータ(ズーム)


元のデータは図9と同様です。
16倍スーパーサンプリングでは図10と比べてかなりなめらかになりました。全体波形は図11とほぼ同じなため省略します。


スプライン関数によって信号補間を行うSSDACの動作がご理解いただけたでしょうか。
このプログラムにより、今回ご用意した1kHz、10kHzの正弦波、方形波の他にも任意のWAVファイルを処理することができ、スーパーサンプリング倍率も任意に設定可能です。ぜひいろいろな波形、いろいろな条件で試していただきたいと思います。

さて、この記事の続編として、今回と同じくPythonで記述したソフトによってスーパーサンプリングした信号をファイルとして取り出し、擬似的にハイレゾ化する検証をする予定です。つまりスーパーサンプリングによるSRC(サンプリングレートコンバーター)です。

通常、アップサンプリングしたからといって音質が良くなるわけではなく、条件によってはFIRフィルタの使用によってプリエコー、ポストエコーが付加されるなど、百害あって一利無し、と考えられますが、スーパーサンプリングによってアップサンプリングし、それを市販のDACで再生した場合、発生するプリエコー、ポストエコーの周波数はスーパーサンプリングの倍率分高くなりますので、聴感上の悪影響が減少すると考えられます。

| | | コメント (0)

2024年6月 6日 (木)

トランジスタ技術7月号 記事掲載のお知らせ

Toragi202407

6月10日発売のトランジスタ技術7月号別冊付録 「使えるはんだ付け 小型&チップ部品対応」 に私が書いたインタビュー記事が掲載されます(^-^)
これはトラ技ジュニア2018年5月号「宇宙に届け! 日本のはんだ付け技術 」の再掲です。

2018年に、NECスペーステクノロジー社の宇宙機器専門はんだ付け職人、斎藤克摩氏にご協力いただいて、宇宙機器のはんだ付け技術について取材し、記事を書かせていただきました。

NECスペーステクノロジー社はJR南武線西府駅からすぐの、NEC府中事業所内にある、人工衛星やロケットなどの宇宙機器を専門に扱う会社で、開発から販売まですべてのサービスを行っている会社です。


20240606trgbst

記事はこんな感じです。

取材に行ったNECの事業所がある西府駅前には御嶽塚古墳があって、いきなり興味をそそられます。御嶽塚古墳の建設は6世紀前半と言われています。

取材に行った2018年からもう6年経って、ことしはH3ロケットの打ち上げが成功しましたね。トランジスタ技術本紙は「月面探査に学ぶ自律走行ロボット」を特集しています。

ぜひぜひお読みくださいね!!


| | | コメント (0)

2024年6月 4日 (火)

ブログ表紙写真のナゾ

202106061721veranda20220211
写真1.これまで使っていた当ブログの表紙写真

写真1は、ついこのあいだまで使っていた当ブログの表紙写真だ。
ベランダから見える風景なのだが、色調がサイケな感じになっている。なぜこんな写真が撮れたのか?

2020年頃から、ESP32-CAMというESP32マイコンとOV2640カメラを一体化したモジュールを使って、WIFI接続できるカメラを試作してあれこれ実験していた。
どこにでも設置できる電池駆動のライブカメラが作れないかと思い試作したところ、18650リチウムイオン電池を1本使って、15分に一度写真を撮ってWIFI経由でFTPサーバーに写真を送るという仕様で、電池もちが1週間程度確保できた。

マンション3階のベランダなので、人が通ることも猫が通ることもなく、ごくごくまれにハトやすずめが写る程度で、ふだんは何の変哲もないベランダが写るだけだ。でも長期運用していると、季節ごとの日の出日没の日射しの様子や天気、それにその時々にバラが咲いたり朝顔が咲いたりしているのが写るので、それなりに趣がある。

2022年頃に、ESP32-CAMに搭載しているOV2640を、広角レンズがついたものに交換した。このときレンズが長くなってケースに付けたレンズカバーに当たるようになってしまったので、ケースを設計し直して3Dプリントし、透明のレンズカバーも交換した。広角になったので画角が広がってベランダが広々と写るようになった。

ところが、翌日から色調が異常な感じになってしまった。早朝の夜明けから日が出てくるあたりまでは正常に写っているのだが、日の出後は色調が異常になる。夕方の日没後は正常に戻る。そしてこの現象は曇っている日は出にくい。
もしかしたら広角のOV2640は仕様が変わって初期設定を変更する必要があるのかと思い、いろいろ調べてみたが原因らしきものが見つからず、ずいぶん時間を費やしてしまった。写真1はそのときにテストで撮影したベランダからの風景だ。

しばらくあれこれ検討してみたがどうしても直せず途方に暮れていたときに、ふと、ケースを変更したときにケースに付けるレンズカバーを新しくしたことを思い出した。まさかとは思ったが、レンズカバーを外して撮影したところ正常に写るようになった(^-^;

もともと付けていたレンズカバーはCDケースの透明なふたの部分を切り抜いて作ったものだったが、広角レンズに変更したときに付けたのはアクリル板を切り抜いて作ったものだ。
「透明ならなんでもいいやー(^-^)」
と安易にアクリル板を使ったが、これが問題の始まりで、非常にアサハカだった(^-^;

念のため秋月でLTR390というadafruit製のUVセンサーを買ってきて、UVLEDを使って透過光を測定したところ、このアクリル板はUVを大幅にカットする性質があることがわかった。
つまり、昼間、太陽光にUVが多く含まれた入射光に対しUVのみをカットしてOV2640で写すと、自動色調がバグるらしい。

写真1はUVがカットされたためにOV2640の色調動作がおかしくなった状態で撮影されたものだったということだ。
ただ、この写真はサイケな感じがしておもしろかったので、ブログの表紙に採用したのだった。

さて、きのうから当ブログの表紙写真を変更した。
この写真は去年の8月31日に出張で行った高松からの帰りの飛行機から見た富士山だ。
この日は運良く、飛行コースや天気に恵まれてとても美しい富士山を見ることができた。かなり長い時間、夕暮れ時の富士山を見ることができた。これは何十枚か撮った写真のうちの一枚だ。日本に生まれてよかったなあ(^-^)


| | | コメント (0)

2024年3月26日 (火)

パソコンSDカードスロットの接触不良修復

普段使いのノートPC、レノボG50-70のSDカードスロットが接触不良になってしまい、たいへん不便な状態が続いていた。

機会を見てレノボの裏蓋を開けて、SDカードスロットにアクセスできるようなら掃除しようと思っていたが、実際に開けてみるとどうやらSDカードスロットの接点にアクセスするのはほとんど不可能らしいことがわかった。SDカードの挿入口は狭いので、綿棒も入らないし、ヘタに接点をひっかけて曲げてしまったりしたらもうどうしようもないので、なにかよい方法はないか考えたが、少々力業的な方法でとりあえず使えるようになったので、紹介する。

まず状況としては、SDカードスロットにSDカードを挿しても反応しないか、反応しても書き込み、削除ができなかったり、読み出し中に認識しなくなったりする。SDカードの接点を掃除しても状況は改善せず、またべつのSDカードを挿しても現象は同じなので、スロット側の接点の問題だと思われる。
SDカード接点にエチルアルコールを付けて抜き差ししてみると、ほんの少しの間はなんとなくよくなったような気がしなくもなかったが、またすぐに元の状態に戻ってしまった。接点復活剤はどうかというと、油膜が残留するため、汚れを吸着してかえって悪化する恐れもあるので使わなかった。

考えられるのは、SDカードスロット側の接点の汚れか、接点圧がゆるくなったのかのどちらかだろう。接点圧低下ならお手上げだ。

SDカードスロットの接点の汚れだとしたら拭くか磨くかすればよさそうだが、なにしろアクセスができない。
そこで今回はmicroSDアダプタを改造して、クリーニングSDカードを作った。これはSDカードの金属接点の部分を紙やすりに換えて、挿入したときにSDカードスロットの接点を強引に磨く狙いだ。

20240326sdc1
写真1.分解して金属接点を取り除いたmicroSDアダプタと、切り抜いて裏に両面テープを貼った紙やすり(左)


写真1に示すように、microSDカードアダプタを分解し、内部の金属接点を剥がして除去し、金属接点の場所に合うように紙やすり(#2000)を切り抜いて裏に両面テープを貼ったものを用意する。

20240326sdc2    
写真2.接点部分に紙やすりを貼ったところ

写真2のように従来金属接点があった部分に紙やすりを貼付ける。


20240326sdc3
写真3.クリーニングSDカード


写真3に示すように、microSDカードアダプタのフタを付けなおしてクリーニングSDカード完成。
ただ、紙やすりの厚さ分、もとのmicroSDカードアダプタよりも若干厚くなってしまった。

これを問題のノートPCのSDカードスロットに差し込むのだが、少し厚さが増して、かなり渋くなってしまったので、無理に押し込むと抜けなくなる恐れがある。そこで、ラジオペンチでヘリをくわえて数回抜き差ししてみた。



20240326sdc4
写真4.抜き差し後のクリーニングSDカードやすり面


数回抜き差しした結果、クリーニングSDカードのやすり面に摺動痕がついてきた(写真4)。どうやら接点は磨けているようだ。

デジカメのSDカードを入れてみると、はたして、接触不良は解消した\(^o^)/


言わずもがなですが自己責任でお願いします。
   
  

| | | コメント (0)

2024年3月10日 (日)

ツミ(雀鷹 )の幼鳥

20240310tsumi1 20240310tsumi2

朝の散歩をしていたら見慣れない鳥が木に止まっていたので写真を撮ってきた。
帰ってからネットで調べると、どうやら猛禽類の”ツミ”という鳥の幼鳥らしい。
東京では絶滅危惧種に指定されているが、明治神宮や石神井公園では観察される鳥だそうだ。

ただ、東京ではおおむね4月ごろに抱卵、5月に育雛、6月に巣立ちということらしいので、まだ冬のようにさむいきょう3/10に中野区内の市街地になぜ幼鳥がいたのか謎だ。迷子かな?

| | | コメント (1)

«気圧変動と頭痛