PCの不調を復旧する~見過ごされた破損ファイル~

2020/12/20

 ほっとしたのもつかの間、12月の月次更新プログラムのWindowsUpdateが自動実行されましたが、なぜかインストール後の更新プログラムを構成で7%まで進行した後、リブートを経て「更新プログラムを構成できませんでした」となりました。エラーコードは、"0xE0000100" でした。PowerShellで"Get-WindowsUpdateLog" を実行して"WindowsUpdate.log" を抽出して確認しましたが、原因につながる詳細なログは、残っていませんでした。


世の中の事例を調べてはみましたが解決策は見つかりませんでしたので、まずは、WindowsUpdateカタログから個別の更新プログラム(kb4592438で検索)をダウンロードし、単独実行して、ログの採取を試みました。ログは、"C:\Windows\Logs\CBS\CbsPersist_2020xxxxxxxx.log" にありました。その内容を注意深く確認したところ、下記のように、"DriverUpdateInstallUpdates failed [HRESULT = 0xe0000100 - Unknown Error]"であることがわかりました。

2020-12-14 11:19:59, Info   CBS    Perf: Doqe: Install started.
2020-12-14 11:19:59, Info CBS Doqe: [Forward] Installing driver updates, Count 646
2020-12-14 11:19:59, Info CBS Progress: UI message updated. Operation type: Update. Stage: 0 out of 0.
Percent progress: 7.
2020-12-14 11:20:01, Info CBS DriverUpdateInstallUpdates failed [HRESULT = 0xe0000100 - Unknown Error]
2020-12-14 11:20:01, Info CBS Doqe: Failed installing driver updates [HRESULT = 0xe0000100 - Unknown Er
ror]
2020-12-14 11:20:01, Info CBS Perf: Doqe: Install ended.
2020-12-14 11:20:01, Info CBS Failed installing driver updates [HRESULT = 0xe0000100 - Unknown Error]
2020-12-14 11:20:01, Error CBS Shtd: Failed while processing non-critical driver operations queue. [HRES
ULT = 0xe0000100 - Unknown Error]
2020-12-14 11:20:01, Info CBS Shtd: Rolling back KTM, because drivers failed.

このエラーに関するドライバーインストールのログが無いか調べてみると、"C:\Windows\INF\setupapi.dev.log" であることがわかり内容を確認すると、下記のようにinfファイル中のsignatureに問題があるとのエラーでした。対象のファイルを確認すると先頭のバイトが壊れて、正常なinfファイルになっていませんでした。infファイルは、sfcの対象になっていないようで、"Update Sequence Array" の不整合によるfixup処理によりで先頭のバイトが破損した可能性があります。MFTの構造上、1クラスタ内に収まる小さなファイルの場合、発生しやすいと考えられます。



前記で使用したmountされているWindowsイメージから同じファイルを見つけ、前記の手順で上書き復元をしたところ、無事更新プログラムが正常に実行できました。

>>>  [Install Driver Updates]
>>> Section start 2020/12/10 15:41:19.614
cmd: C:\WINDOWS\winsxs\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.19041.680_none_
e72768c3263f99bc\TiWorker.exe -Embedding
sto: Image State = Specialized
sto: Image Architecture = amd64
sto: Image OS Version = 10.0.19042
sto: Image Product Type = WinNT
sto: Transaction = CbsDriversAndPrimitives
sto: Driver Updates = 646
! inf: Unable to load INF: 'C:\WINDOWS\System32\DriverStore\FileRepository\kdnic.inf_amd64_6649425cdca
e9b5f\kdnic.inf'(e0000100)
! inf: Error 0xe0000100: The style of the INF is different than what was requested.
!!! inf: Invalid INF 'C:\WINDOWS\System32\DriverStore\FileRepository\kdnic.inf_amd64_6649425cdcae9b5f\kd
nic.inf', must contain [Version] section and have signature "$Windows NT$". Code = 1001
!!! sto: Failed to get version info for driver update 'C:\WINDOWS\System32\DriverStore\FileRepository\kd
nic.inf_amd64_6649425cdcae9b5f\kdnic.inf'. Error = 0xE0000100
<<< Section end 2020/12/10 15:41:22.020
<<< [Exit status: FAILURE(0xe0000100)]


やっとPCの不調を復旧できたようです。


同じようなWindowsUpadeトラブル事例を検索してみた感想では、ログ解析方法が明らかにされていないのか、原因の特定が難しいのか、効果があるかもしれない対策方法を列挙したり、自動修復プログラムを紹介したりすることが散見されていました。当たるも八卦当たらぬも八卦状態です。パソコンメーカーのサポートでも同じレベルでした。特に日本のマイクロソフトのサポート情報は、エラーコードに対応した対策に言及せず、うまくいった事例を紹介しているだけが多いようで、役に立たないことが多いと感じました。米国のマイクロソフトのサポート情報ほうが有用な感じでした。


WindowsUpadeトラブルは様々な要因で頻発する傾向があり、マイクロソフトがエラーコードの意味やそのエラーコードに対応した対策を公開するか、修復可能範囲を広げるDISM等の機能強化を提供してくれたら多くのユーザが助かるかと感じたのは、私だけではないと思います。マイクロソフトのサポートが大変になるので、ユーザがあまりやりたくない新規再インストールに仕向けようとしているのではと、勘繰りたくもなります。


いずれにしても、今後はバックアップを頻繁に行いたいと思います。ログの解析方法など、参考にしていただければと思います。

(再クロール更新:2022/12/22)

PCの不調を復旧する~ほんとうの修復(復元)~

2020/12/19

 ほんとうの修復(復元)のため、破損したパスを特定し、必要なファイルを上書きします。


①孤立ファイルの復元

まず、found.xxxディレクトリ内のファイル名および、バージョン情報からどのファイルパスから切り離されたかを特定します。アプリケーションの一部なら、アプリケーションを再インストールすれば、復元できます。幸いにもバックアップがあれば、切り離された部分の上位から上書きすれば、復元できます。また、アプリケーションの一部であれば、アンインストールや再インストールで、問題を解消できます。


②「破損した基本ファイル構造が見つかりました」の復元

ファイル名が記載されていると思いますので、前記と同様に、ファイルパスを特定後、上書きにより復元が可能になります。


③「ファイル *** のインデックス $I30 で、エラーが検出されました。」の復元

ファイル名が記載されていれば、前記と同様に、ファイルパスから上書きにより復元が可能になります。ファイル番号の場合は、DiskEditというツールで、ファイル番号からファイルパスに変換できます。「diskedit microsoft」の検索で、調べてみてください。


④「ディレクトリ "\***\***" のインデックス "$I30" に不要なリンク ($FILE_NAME: "******") が見つかりました」

これは、WindowsがDLLなどのバージョン管理のために、ハードリンクを多用しているために発生しやすいようです。今回は、ファイルシステムが損傷している時に、WindowsUpdateが走ってしまったので、多発したようです。PCにトラブルが発生した場合は、WindowsUpdateを停止させておくと無難なようです。いずれにしても、次の段階「DISMおよびsfcによる復元」で対応できると思います。


⑤「ブロック 0x** の USA 確認値 0x** が正しくありません。」

これは、NTFSのMFTと呼ばれる属性情報内で、"Update Sequence Array"値の不一致が見つかった場合です。今回のようなPCの不調のように、何らかの問題で属性情報の更新が中断してしまったようです。この不整合が見つかると、ファイル本体のfixupという操作が正しく行われない場合、ファイルクラスタ内の特定の1バイトが誤った内容になることがあります。対象となるパス名を特定することはできますが、非常に手間がかかりますので、「DISMおよびsfcによる復元」で解消できる期待することにします。この段階では、何もしませんが、Active@ Disk EditorというNTFSの内部を参照できるツールとNTFSの構造を理解すると、特定ができるようです。


⑥DISMおよびsfcによる復元

DISMは、Windowsのインストールイメージ作成のため、パッケージの追加・更新・削除ができる非常に多機能なツールです。稼動しているWindowsにたいしても、同様な機能を持っていますので、WindowsUpdateの一部として動作するようです。さらに、下記のようにインストールされているパッケージが破損していれば、復元してくれる便利な機能があります。


Dism /Online /Cleanup-image /RestoreHealth


期待して実行してみましたが、実行結果は「エラー: 0x800f081f ソースファイルが見つかりませんでした。」で復元できませんでした。いくつかのファイルは、復元できたようですが、復元できないファイルがあるようです。このエラーは、WindowsUpdateに対象のファイルが見つからなかったようです。このエラーが発生している事例が結構多いようです。


下記のようにsfcで、Windows本体以外のファイルの復元を試みましたが、これまた、復元できないファイルが残っているようです。


sfc /scannow


ここで、アプリケーションを保持しながらWindowsの上書きインストールを試してみましたが、途中で、何らかの問題があるようで、インストールが中断・ロールバックされてしまいました。


そのため、破損ファイルをできるだけ上書きするために"Windows10 20H2"の更新プログラムを実行したところ、正常に更新されました。


期待しながらDISMとsfcを実行しましたが、やはり破損ファイルが残っていました。ここまでは、自動的なツーツに頼ってきましたが、ここからは、手動操作しかないので、詳細な原因を調べていくしかありません。そこで、"C:\Windows\Logs\DISM\dism.log" と、"C:\Windows\Logs\CBS\CBS.log" を注意深く確認したところ、"Cannot repair"と記載された部分が破損しているが復元できなかったことがわかります。


多くの破損ファイルは、古いバージョンのパッケージに含まれているようで、"C:\Windows\WinSxS" 配下にありました。WindowsUpdateへのアクセスはありましたが、最新のパッケージ情報に基づいたWindowsイメージからしか修復ができないためか、ソースファイルが見つかりませんでしたになっているのではないでしょうか。古いバージョンのファイルは、復元が効かないようです。WindowsUpdateのバージョンは、すでに月次更新が適用されているのではないでしょうか。


そこで、DISMのメッセージ「機能の復元に必要なファイルの場所を指定するには、”Source” オプションを使用してください。ソースの場所 の指定の詳細について は、http://go.microsoft.com/fwlink/?LinkId=243077 を参照してください。」に従い/Sourceオプションを使用するため、rufusを使用してWindowsインストールイメージをUSBメモリに保存しました。各ビルド毎のWindowsインストールイメージが選べる点が優れています。今回は、破損したファイルのビルド番号から"Windows10 20H2"でした。


下記のようにDISMで、ローカルドライブにWindowsイメージを展開し、mount状態にします。mountと言っても、所有者をTrustedinstallerにして、容易な改ざんを防いでいると思われます。"index:3"は、Windows10 Professinalを指定しています。(それぞれのパスは、環境により変わりますのでご注意ください)


Dism /Mount-Image /ImageFile:H:\sources\install.wim /index:3 /MountDir:G:\dism\mount


次のように復元を試みましたが、依然「エラー: 0x800f081f ソースファイルが見つかりませんでした。」となりましたが、いくつかの破損したファイルは修復できたような感じです。


Dism /Online /Cleanup-Image /RestoreHealth /Source:G:\dism\mount /LimitAccess


ディレクトリ名からファイルのビルド番号がはっきりしていますので、Windowsの更新履歴から、WindowsUpdateカタログの番号を特定し、対象の更新プログラムを見つけダウンロードして再インストールを試みましたが、すでにインストール済になり、再インストールができませんでした。これは、パッケージの状態がパーマネント(更新プログラムがクリーンアップされている場合)であると、修復ができないのではないかと思われます。


最終手段として、破損しているファイルを手作業で上書きすることにしました。ところが、問題は、特定できたビルド番号のDLLなどの更新ファイルがWindowsUpdateカタログから入手した更新プログラムから直接取り出せないことでした。再インストールもできませんので、DISMのイメージ管理機能を使用し、mountできているWindows10インストールイメージに、更新プログラムを適用してDLLなどのファイルの実体を取り出すことにしました。C:\mountに更新プログラムを配置した場合、下記のようなコマンドとなります。


Dism /image:G:\dism\mount /add-package /PackagePath:C:\mount


Windows10インストールイメージ、"G:\dism\mount\Windows\WinSxS" から特定のパッケージのDLLなど、対象ファイルを上書きすることにしました。事前準備として、上書きが必要なファイルの所有者を変更し、更にフルコントロールの権限を付与しておく必要があります。上書き後は、元に戻しておく必要があります。残った破損ファイルが2つのファイルだけでしたので、それほどの手間ではありませんでした。


再度、DISMで修復確認を行うと、100%完了状態となりました。


次は、sfcで残ったファイルを復元することにしました。"C:\Windows\Logs\CBS\CBS.log" 内の"Cannot repair"の破損したファイルが対象になります。DISM時の復元手順と同じように上書きし復元しました。


また、"Visual C++ 2008 Redistribute - X64"のDLLが破損しているとのことで、これは、アンインストールし、改めて最新版をインストールすることで、破損部分を破棄できました。


以上のような復元にチャレンジした結果、CHKSDK、DISM、sfcをすべてクリアできました。まずは、ほっとしました。

(再クロール更新:2022/12/22)

PCの不調を復旧する~CHKDSKの修復と復元とは違う~

2020/12/18

 CHKDSKは、下記のステップでファイルシステム構造上の不整合を検出・修復できるツールです。


ステージ 1: 基本のファイル システム構造を検査しています ...

ステージ 2: ファイル名リンケージを検査しています ...

ステージ 3: セキュリティ記述子を検査しています ...

CHKDSK は Usn ジャーナルを確認しています...


ここでの「修復」が問題です。これはファイルシステムの不整合(エラー)の修正(fix)だけです。


ファイルシステムは、ツリー構造のファイル(ディレクトリ)からなり、その構造を管理するための様々な属性情報を持っています。ファイルシステムの構造上の不整合があると、エラーを検出してプログラム(Windowsを含む)が処理の継続ができなくなるだけでなく、ファイルを探す場合、正常に見つけられない、読み込む場合、本来の内容以外の壊れた内容を読み込んでしまう、書き込む場合、書き込んだ内容が既存のファイルや属性情報を壊してしまうなど、Windowsが自滅することにもつながります。


CHKDSKは、ファイルシステム構造上の不整合を検出し、Windowsがどのファイルにも安全にアクセスできるように、可能な限りその不整合を解消します。「可能な限り」とは、利用できる情報があれば不整合を修正し、その結果で正常な範囲を温存し、異常な部分を切り離します。この切り離された部分を含み、ファイルシステムが使用済みとマークされた領域に断片的なファイルの属性情報や内容が見つかれば、孤立ファイルとして、ルートディレクトリの配下にfound.xxxというディレクトリに配置されます。異常な部分を切り離によっては、必要な情報が整っていない場合、ファイルやディレクトリの救済ができず紛失することもあります。


この過程で、下記のような難解なログメッセージが吐き出されます。


破損した基本ファイル構造が見つかりました

ブロック 0x** の USA 確認値 0x** が正しくありません。

ディレクトリ "\***\***" のインデックス "$I30" に不要なリンク

 ($FILE_NAME: "******") が見つかりました

 ... オンラインで修復しました。

ファイル *** のインデックス $I30 で、エラーが検出されました。


破損して利用できない部分は、トカゲのしっぽのように切り離し、Windowsがどのファイルにも安全にアクセスできるようにできるわけですが、必須なファイルが紛失したり、修復過程でファイルの破損やハードリンクに問題が発生するとWindowsが正しく動作しないことがあります。


以上のように、CHKDSKは、破損した部分を復元(restore)できるわけではありません。運よくWindowsが立ち上がれば、破損したパスを特定し、破損したファイルを上書きをしなければ復元ができません。

(再クロール更新:2022/12/22)

PCの不調を復旧する~突然PCが落ちる~

2020/12/17

 Windows10 Professionalが突然落ちて、画面が真っ黒になり、何が起こったのかわからなくなりました。気が付いてみると、PCを購入してからすでに8年ほど経っていました。半年ぶりにPC内部の埃の掃除し、点検しましたが、特に問題は見つかりませんでした。


SSDのSMARTを確認し、記憶内容の読み込みエラーが発生していないか確認しましたが、読込みエラーは、ありませんでした。次に、怪しい部分は、電源の不調によりリセットが発生したかもしれないので、念のため電源容量が十分な新しい電源ユニットに交換してみました。依然として、突然PCが落ちることが治りませんでした。


ここで、以前のWindowsなら、ブルースクリーンが出てから落ちるようになっていたことに気が付き、なぜブルースクリーンが出ないか、確認すると、Windows10では、システムエラー時、「自動的に再起動する」がデフォルトになっていました。おせっかいの極みです。ブルースクリーンが出るようにすると、「MEMORY_MANAGEMENTエラー0x0000001a」が発生していました。


これは、メモリーに問題がある場合に発生することが多いため、メモリー診断を行いましたが、問題無いようでしたが、よっぽど状態が悪くない限りエラーを発見できないようです。突然PCが落ちる頻度は、30分~数時間ですので、次に、DIMMコネクターの接触不良ではないかと、接点を清掃して2枚のDIMMを入れ替えましたが、まだ、突然PCが落ちます。しかたがないので、メモリを新調したところ、治まりました。


原因が特定できて少しほっとしたました。ところが今度は突然PCが落ちたために、SSDのCHKDSKが必要な状態になりました。しばらく起動時のCHKDSKをスキップさせていましたので、CHKDSKを行うと修復はできましたが、ボロボロ状態でした。念のため、バックアップソフトで、パーディションのバックアップを取ろうとしましたが、セクター単位でしかバックアップが取れませんでした。(ファイルシステムに問題がある証拠です)


NTFSは、ジャーナルによって、ファイルシステムが必要なロールバックにより、整合性を保つ仕組みがあるはずでしたが、なぜか、修復を必要な状態になってしまいました。泣きっ面に蜂状態です。思い起こすと、HDDをSSDに乗せ換えたときに、AHCI モードを使用し、ドライブ側のWriteキャッシュを有効にしていたことに気が付きました。これでは、ドライブ側のWriteキャッシュが捨てられることが発生し、NTFSのロールバックが意味なくなることになります。わかっていたものの、パフォーマンスを重視しすぎました。


さて、たくさんのアプリケーションをインストールしている環境なので、Windowsの新規インストールは避けたいところです。SSDの復旧をするしかない状況になりました。

(再クロール更新:2022/12/22)

SBCZ80ルーズキットの製作(8MHz動作編)

2020/09/25

 10MHz高速版のSIOが届きました。



まず8MHzで動作させましたが、問題なく動きました。ただ、DRAMのアクセスタイムが100nS必要で、オーバークロックになっています。ASCIIART.BASの速度は、速いのは速いのですが、それほど体感速度が出ませんでした。Z80は、結構クロック数を必要としますので、仕方がない気もします。


10MHz版のSIOには、オーバークロックになりますが、16MHzを試してみました。残念ながら動作しませんでした。スペックを確認すると、16MHzの場合、DRAMとEEPROMのアクセスタイムが70~80nSが必要なようで、今回は共に150nSでしたので、当たり前みたいです。

(再クロール更新:2022/12/22)

SBCZ80ルーズキットの製作(シリアルハンドシェーク編)

2020/09/24

 GRANTBASで、ASCIIART.BASを走らそうとしましたが、TeraTermでプログラムをペーストすると、シリアルポート入力の取りこぼしが発生しました。


TeraTermのフロー制御を"hardware"にしましたが、改善しませんでした。GRANTBAS.ASMの確認を行うと、RTSのハンドシェークがされていませんでした。下記のような、修正を行ったところ、問題なくペーストできるようになりました。大きなプログラムでは、必須な機能ですので、必要な方は、修正をお勧めします。


修正内容は、入力バッファの残りが4文字より少ない場合、RTSをINACTIVEに、入力バッファ中の文字数が4文字以下の場合。RTSをACTIVEにしています。

【修正前①】
; CHECK BUFFER FULL
LD A,(RBFCNT)

【修正後①】
; CHECK BUFFER HIGH
LD A,(RBFCNT)
CP RBFSIZ-4
JP M,CHKFUL
LD A,005H ; WR5
OUT (PSIOAC),A
LD A,0E8H ; RTS INACTIVE
OUT (PSIOAC),A
; CHECK BUFFER FULL
CHKFUL: LD A,(RBFCNT)

【修正前②】
; READ DATA
LD A,(RBFCNT)

【修正後②】
; CHECK BUFFER LOW
CP 4
JP P,RDDAT
LD A,005H ; WR5
OUT (PSIOAC),A
LD A,0EAH ; RTS ACTIVE
OUT (PSIOAC),A
LD A,(RBFCNT)
; READ DATA
RDDAT: LD A,(RBFCNT)

なお、ZTB.ASMも同様です。

(再クロール更新:2022/12/22)

SBCZ80ルーズキットの製作(ファームウェア編)

2020/09/22

 SBCZ80の改造で使用したPIC12F1822のファームウェアの紹介です。


今回は盛りだくさんになったため、全部ピン使用することになりました。

①シリアルインタフェース用クロック信号

②CPUクロック信号

③CPUリセット信号

④DRAMリフレッシュ用NMI信号


このPIC12F1822は、低価格で入手できます。秋月電子通商では、現在1個 ¥110(税抜き)で販売されています。ファームウェアを開発したり、書き込みしたり手間はかかりますが、その柔軟性に魅力があります。


今回、参照クロック、PWM、Timer0、Timer1各モジュールを使用しましたが、利用パターンに慣れると、結構簡単に利用できます。ただ、各モジュールで利用可能なピンの制約がある点に注意する必要があります。

PIC12F1822のファームウェアのソースコードを公開しますので、自己責任で自由に利用ください。なお、2MHz/4MHz/8MHz各CPUクロックのHEXファイルも同梱していますので、必要に応じ活用ください。


ちなみに、CPUクロック4MHz版は、Z80Aの4MHzに最適で、シリアルインタフェース用クロックと合わせて使用をお勧めします。シリアル速度自動設定が不要な場合は、5ピン(RXD)は、未配線にしておいてください。


DRAMリフレッシュ用NMI信号は、48KBにDRAM拡張する場合に使用したら良いかと思います。CPUリセット信号は、CPUリセット不良が発生するCPUとSIOの相性が悪い場合に利用ください。4ピン(PWR)に入れる直列抵抗は、ICSP(インサーキットプログラミング)しないのであれば、不要です。


この機会にICSP経由のソケットアダプタを製作しPICkit3との組み合わせて使いました。


下記は、電源投入時のPWR、~RST、~NMI、SIOのRTSの波形です。


次は、リセットボタン使用時のPWR、~RST、~NMI、SIOのRTSの波形です。


(再クロール更新:2022/12/22)

SBCZ80ルーズキットの製作(改造編)

2020/09/21

 以下の改造には、組立前に基板の箔カットが必要になりますので、ご注意ください。


①DRAM容量アップ(48KB)


uPD41464(64kx4bit)を使用しました。M5M4416とピン互換ですが、4倍の容量があります。

改造ポイントは、


・CPUメモリアドレスデコーダの拡張


・アドレスマルチプレクサの拡張


・NMI信号の生成とZ80のNMIへの接続


Z80は、通常2mS/128リフレッシュしかサポートしていませんが、A7は、出力されますので、NMIで補完すると、4mS/256が実現できます。NMI信号の生成は、後述のPIC12F1822で行い、Z80のNMIに接続します。



・GRANTBAS、ZPTB、Universal Monitor Z80のRAM領域の変更および、NMIハンドラの追加(diff結果


②クロック高速化(8MHz)


Z80クロック信号の生成は、PIC12F822で行います。


③シリアル速度自動設定(9.6kbps~115kbps)


シリアル速度自動設定は、PIC12F822で行います。


下記は、PIC12F822周りの改造回路です。IC11に実装しましたので、回路図は、IC11のピン番号になっています。


以下は、PIC12F822の仕様です。



①SCLK: SIOクロック(2PIN)


電源投入後2後~30秒までの間に、SIOのRXD端子からCRコードを検出して自動速度設定を行います。57.6kbpsと115.2kbpsでは、偏差が大きいので、使用できない場合があります。

検出速度   実測周波数
9.6kbps 153.6kHz
19.2bps 307.2kHz
38.4kbps 614.5kHz
57.6kbps 914.5kHz
115.2kbps 1937kHz


②CLK: Z80のクロック(3PIN)


デフォルトは、4MHzにしていますが、PIC12F1822のプログラム切替で、2/4/8MHzの選択が可能です。


③PWR: 抵抗を介して、リセット用のCR回路に接続します。(4PIN)


④~NMI:DRAM 4mS/256リフレッシュ用割り込み(7PIN)


Z80のNMIに接続します。下記は、NMI割り込み処理で、Z80のRレジスタ更新を2mS毎に行います。ROMに埋め込む必要があります。

;	NMI HANDLER
; TARGET: SBCZ80
; ASSEMBLER: ARCPIT XZ80.EXE
;
NMI EQU 0066H ;NMI HANDLER ADDRESS
;
; NMI HANDLER
ORG NMI
PUSH AF
LD A,R
XOR 80H
LD R,A
POP AF
RETN


⑤~RST: Z80のリセット信号です。PWRのリセット用CR回路の電圧を監視しています。(6PIN)


~NMIは、このリセット信号解除に同期し、1mS後から出力されます。


⑥RXD: SIOのRXDA端子に接続します。シリアル自動速度設定に使用します。(5PIN)


最後に、以前の改造と同じように、ROMアドレス切替も行い、32KBのEEPROMを16KB+8KB+8KBに区切り、GRANTBAS、ZPTB、Universal Monitor Z80を切り替えて使用できるようにしました。同じくリセットCR回路のダイオードを電圧検出器に交換しています。追って、PIC12F822のソースコードを公開します。


下記は、改造後の基板の様子です。ジャンパが多くなってしましました。次は、8MHzも試してみる予定です。




立ち上げ画面です。"48766 Bytes free"となっています。


(再クロール更新:2022/12/22)

SBCZ80ルーズキットの製作(リセット不良対策編)

2020/09/20

 以前にZ80高速版を手に入れておいたので、SBCZ80を製作してみました。せっかく製作するので、ついでに下記の改造をしてみました。


①DRAM容量アップ(48KB)

②クロック高速化(8MHz)

③シリアル速度自動設定(9.6kbps~115kbps)


それぞれの内容については、順次紹介していく予定ですが、例のごとく必要な基板の箔カットを行った後、配布されているROMイメージを使って基本動作確認を行ったところ、立ち上げメッセージが出てきませんでした。


CPU周りの波形解析すると、CPUリセット後、SIOの初期設定が行われていましたが、RTSがアクティブになりませんでした。プログラムとしては、正常な動作をしているため、回路図、CPU・SIOデーターシートを確認しましたが、特に問題は発見できませんでした。


各部の波形を確認するとCPUのRESET信号が徐々に電圧が上がっていくのが気になり、再度データシートを確認すると、RESET入力は、基本的なTTLレベルの入力信号となっていました。リセット回路は、CPUリとSIOに接続されているので、徐々に立ち上がる入力信号の場合、動作が閾値電圧に左右されることが予想されます。


SBCZ80のリセット回路は、時定数470mSのCRで構成されているので、仮に10mVの閾値電圧の差があると、簡易計算で0.01V/5V*470mS=0.94mS程度の遅延差が発生します。このことは、SIOの閾値電圧が、CPUの閾値電圧に比べ10mV高いと、CPUがSIOを約1mS以内にSIOの初期設定をすると、SIOはリセット中で、初期設定ができないことになります。


確認のため、C15を0.01uFに交換すると、正常にSIOが動き始めました。CPUとSIOはZilog製ですが、たまたま相性が悪かったようです。


相性が悪いCPUとSIOの対策案:


①相性が良いCPUとSIOに交換する(SIOのリセット閾値電圧が、CPUのそれに比べ低い)

②C15を小容量に変更する(0.01uF程度、但し電源SWでのリセットに問題が残ることがある)

③モステックの資料のようにCR回路の後にシュミットトリガー回路を使用する

④CPUリセット後、十分待ってからSIOの初期設定を行う


もし、SBCZ80が動かない場合、②でリセットボタンを押して切り分けをしてはいかがでしょうか。恒久的には、③が良いかもしれません。


下記は、モステックの資料からの転載です。



今回の改造では、PIC12F822で、CPUクロック、CPUリセット、NMI信号、SIOクロックを発生させることにしました。

(再クロール更新:2022/12/22)

AI投資予測へのチャレンジ ~ ロボアドの上を行く投資コース予測

2020/08/28

 プロが、運用実績データを眺めながら、コース変更をすれば、良い結果がでると思いますが、初心者には難しいかもしれません。そこで、AI投資予測(ディープラーニングに代表される機械学習)にチャレンジしてみることにしました。うまくいけば、新しいロボアド(ダイナミック・ロボット・アドバイザー)ができることになるかもしれません。


一度、ディープラーニングに触れてみたいと思っていた中で、投資予測に関して、以前の仕事関係者からディープラーニングでは、予測精度があまり出なかったと聞いたため、戦々恐々でスタートしました。


当初、時系列データ分析で、各コースの基準価格を入力して将来の基準価格を予測させてみましたが、予測された基準価格から有望なコースを判定しようとすると、わずかな差に左右されるようでした。


そこで、文字認識のように8種類(コース)に分類される画像データ(2次元時系列データ)を入力し、8種類各々の確率を推定するモデルを考えました。なんとなく用途実績があり、曖昧な判定をこなす機械学習に向いている気がしました。上記画像データに相当するのは、今回では市場指数の時系列になります。教師データは、各コースの基準価格の騰落率実績に基づき、コースを選択します。


動的なコース選択予測を下記のような条件で検証を行ってみました。市場指数と各コースの運用成績の相関があるだろうとの仮定を立て、日経225、ダウ、ドル円、米国10年債を採用しましたが、教師データにHコースを除外しているため、Hコースに相関がありそうなナスダック指数は、外すことにしました。


①環境:anaconda環境下(python=3.7.7、tensorflow==1.15.3、keras=2.3.1)、

 spyderを使用

②入力データ(25営業日分):日経225、ダウ、ドル円、米国10年債

③教師データ:翌月11~翌々月11日までの最大騰落率のコースが「1」のデータ

 (但し、Hコースは除外)

④モデル構成:隠し層が100あるシンプルなLSTM

⑤学習:日々の入力データに対するコース選択の教師データ

 (設定当初から2020/1/29まで、約900セット)をepochs: 1800で学習

⑥評価:学習したモデルを使い、2020/1/30時点で翌月運用コースを予測

⑦翌月分を追加学習し、2020/28時点で翌月運用コースを予測

⑧同様に、2020/6/29時点まで翌月運用コースを予測


下記は、モデルのサマリーです。

Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer) (None, 25, 4) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 100) 42000
_________________________________________________________________
dense_2 (Dense) (None, 8) 808
=================================================================
Total params: 42,808
Trainable params: 42,808
Non-trainable params: 0

各々の予測したい時点より前のデータにより学習し、2020/1~2020/6までを予測した結果、上限理論値騰落率12.20%に対して、予測騰落率9.47%(年率換算16.23%)となり、77.62%の到達率を獲得できました。コロナショックを受けた期間ですが、良い成績を確保できています。ちなみにリスクは大きいが、リターンが大きいコースHの実績騰落率は、-3.99%ですので、13.46%も優れていることになります。

予測日     翌月最適 翌月予測 翌月最適  翌月予測  翌月理論  翌月コースH
コース  コース コース コース 上限 崩落率
崩落率 崩落率 崩落率
2019/12/30 5 7 0.56% 0.54% 0.56% 0.52%
2020/1/30 1 1 -1.97% -2.00% -1.97% -16.10%
2020/2/28 5 7 -1.64% -2.55% -1.61% -17.21%
2020/3/30 7 7 0.45% -0.46% 1.00% -14.61%
2020/4/28 7 7 8.05% 7.15% 9.56% -6.05%
2020/5/29 1 1 8.00% 7.09% 9.50% -6.69%
2020/6/29 7 7 10.37% 9.47% 12.20% -3.99%


※翌月最適コースとは、月間騰落率実績がわかってから選択したコース(コースHを除く)

※翌月予測コースとは、学習したモデルで翌月を予測したコース

※翌月最適コース崩落率とは、翌月最適コースに基づく、2020/1運用開始日からの騰落率

※翌月予測コース崩落率とは、翌月予測コースに基づく、2020/1運用開始日からの騰落率

※翌月理論上限崩落率とは、コースA~Hの月間騰落率実績が高いコースを選んだ最大騰落率、

 2020/1運用開始日からの騰落率

※翌月コースH崩落率とは、コースHを選択した場合、2020/1運用開始日からの騰落率




1か月程度で検証ができことは、tensorflow、kerasのおかげだと、実感しました。経験と試行錯誤は、必要なものの、データと検証方法さえあれば、用途は結構広げられる気がしました。


参考までに、下記は、lossとaccracyの推移で、2016/6~2019/12月末前日の学習の収束状況です。赤が評価データにたいする精度、青は、教師データに対する誤差に相当します。教師データが、「0」と「1」ですので、予測データが教師データをトレースできるまで、収束速度があまり速くありませんが、なんとか収束でき、コース予測精度は悪くありません。



次は、モデルが予想したコース番号(1がコースA、8がコースH)です。



下記は、学習後に求まった予測データに基づく騰落率結果になります。この場合、2020/2以降は、予測精度が落ちるため、解離がありますが、翌月の予測が重要ですので、問題になりません。



モデル構造は、教科書通りにシンプルですが、それなりに苦労した部分は、学習用入力データ、教師データ、検証入力データを作成する部分と本当に必要な月末時点の翌月予測コースの抽出でした。いわゆる前処理と後処理ですが、機械学習には、結構重要なことがわかりました。一旦、学習・評価が回れば、後は、モデル構造・学習段階のチューニングとその評価を効率的にこなせる高性能PCや、NVIDIA Jetson Nanoのような並列マシンがあると、結構効率的にできそうです。


入力データのCSVレイアウト(基準価格と市場指標)は、"Date fund_A fund_B fund_C fund_D fund_E fund_F fund_G fund_H N225 DJ USD USB IXIC"です。すべて公開情報です。決算日の24日前からの日々市場データと日々コース別基準価格を用意する必要があります。このデータから、市場データに対応する将来騰落率を計算し、それに基づく最適コース選択を行いました。

実際に予測したい月末データだけでは、学習に必要な件数が不足してしまうため、日々の学習データに対する将来騰落率を用意し、件数を増やすことにしました。月末前日の営業日入力データに対する翌月運用コースの予測が実際のコース選択に使用できることになります。

ちなみに、RNNの種類としてsimple_RNN、GRU、LSTMを使ってみましたが、LSTMが最も良い結果が出ました。また、2ヶ月先の予測は、あまり精度がよくない傾向がありましたが、翌月の予測は、そこそこです。


今後、精度アップのため、モデル構造・設定項目のチューニングができたらと考えていますが、まだ定かではありません。


いずれにしても、AI技術がなければ、アマチュア(素人?)では効率的な翌月のコース選択は、難しいと思いました。今回は、コースA~Gの選択範囲で過去7か月の実データ検証を行いましたが、下落局面の予測に優れ、コロナショックにもめげず良いパフォーマンスが達成できたことから、ラップ口座の弱点をカバーできそうです。実際の運用に活かしてみたいと思います。運用結果が良ければ、再度紹介するかもしれません。(今回は、内容的に難解な部分もありますが、興味ある方は、参考にしていただければと思います。)

(再クロール更新:2022/12/22)

AI投資予測へのチャレンジ ~ 中長期運用と投資一任契約(ラップ口座)

2020/08/27

 アマチュア無線とはあまり関係ありませんが、アマチュア向けの機械学習技術に関する内容です。


機械学習は、近年急激に発達したAI技術ですが、陰に表に様々な用途に応用され、技術者が足らないと騒がれています。今回は、身近な用途として、金融分野の投資予測にフォーカスしてみました。


さて、様々な資産投資があふれている中で、最近の投資信託は、購入手数料も手ごろになり、お手軽に投資がしやすい傾向になってきました。ただ、中長期の運用に耐える投資信託は、複数の資産に投資するバランス型タイプが向いている気がしますが、1本だけでは限界があります。どのような投資信託を組み合わせたら良いのかわかり辛く、当たりはずれもあります。


このようなニーズに対応するため、中長期の運用で手間をかけずに、それなりのリターンを得ようとした場合、以前から気になっていた投資一任契約(ラップ口座)があります。資産構成割合のリバランスにより、リターンとリスクを最適化しているとのうたい文句になっています。ただ、各社から販売されているわりに、あまり良いイメージがありません。


実際に販売している証券会社の商品説明を聞きくと、投資一任の運用では、必要な期待リターンを選ぶと、過去の運用実績から求まるリスク許容度が提示され、目標が合意できれば、投資先・運用方針を運用会社に一任して、目標達成の推移を見守ることになります。ただ、リターンは、保証されるものではなく、景気によっては上下に振れることが十分あります。長期的には、目標としたリターンが期待できる点とうたっていますが、それにしても運用手数料が高く感じてしまいます。


ラップ口座の問題は、長期的にはリターンが期待できる分散投資運用を行ってはいますが、そのリスク許容度を受け止めざるを得ない現実があります。このような運用では、ある期間で、リターンが高くできても、その後リスクが顕在化して、リターンが高くできない運用となっている気がしてなりません。


そこで、リターンとリスクを動的に選択でき、運用自体は、一任できる投資運用を探してみました。それでみつかったのが、「ON COMPASS」でした。


公開されている商品紹介ページによれば、「ON COMPASS」運用は、月末時点でのコース選択に従い、翌月11日から1か月間行うことができるようです。必要に応じ、契約締結の翌々月の1日から、コース変更可能なようです。また、年齢・投資方針の選択によりリスクの高いコースは、選択できないしくみになっているようです。8コースありますが、年齢が若くないと7コースまでしか選択できないようです。(無料体験で確認可能)


いずれにしても、投資金額の制約がほとんどない点も評価できます。


次に、下記で公開されている各コースの運用実績(2016/6/11~2020/8/11)から、各コースの騰落率を計算すると、


https://www.monex-am.co.jp/price/


Aコース -2.10%、Bコース -4.06%、Cコース  4.43%、Dコース  9.66%

Eコース 14.88%、Fコース 19.11%、Gコース 22.03%、Hコース 24.82%


上位2コースでは、20%を超える実績があります。年率4%程度で悪くはありませんが、次に、この運用実績から、崩落率が最も高いコースを動的に選択できたとしたら、なんと(たら、れば)


動的にコース選択した場合 78.06%


単独コースの3倍以上となり、前記した一任勘定の問題点の仮説が確認できた気がします。上昇局面では積極運用、下降局面では消極運用できたとしたらこれに近くなると思います。この数値は、運用実績を知った後で選択するのですから、数値が良くなるのは当たり前で、上限理論値となります。


運用実績データを眺めながら、経験に基づき、コース変更できれば、ラップ口座の手数料に見合うリターンが実現できるかもしれませんが、AI技術と組み合わせてみたいと思います。まずは、「ON COMPASS」の契約手続きをしてみたいと思います。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~レコード盤のノイズ除去

2020/04/27

 中古のレコード盤の入手後、必ず洗浄して、TASCAM DV-RA1000HDで192KHz/24bitでデジタル化後、クラシック・フォーク・ポピュラー音楽などを楽しめるようになりました。ただ、レコード盤を水洗浄していますので、盤面の塵の影響はないはずですが、レコード盤の状態が悪いとノイズや歪が気になることがあります。中古のレコード盤の場合は、購入後でしか盤面の状態がわからないことが多く、宿命のようです。


①レコード盤の引っかき傷・塵による溝の傷により、クリックノイズ

②レコード溝劣化(針および、微細ほこり等による溝の引っかき傷)による小さなレベルのクラックノイズ・女性ボーカルの歪


①は、大きなノイズであると、同じ位置で聞こえるので、気になります。②のクラックノイズは、全体的に聞こえるので、何とかしたいものです。②の女性ボーカルの歪は、改善が難しいと思います。


試しに、世の中にあるノイズクリーナーソフトを調べてみると、「Digital Sound Cleaner」「Audacityのクリックノイズ除去エフェクト」などがありますが、原音までに悪影響が出やすい傾向にあります。


そこで、波形を目で見て手修正することを自動的に行うイメージで、できるだけノイズのみを除去する192kHz/24bit専用クリーナーを作成してみました。完全にノイズを除去するところまではできませんが、原音をできるだけ損なわないようにしてみました。対象ノイズは、中古のレコードの再生でよく問題になる2種類のノイズです。


①レコード盤の傷による比較的大きなレベルのクリックノイズ

 包絡線レベルを越える急峻なパルス状の波形を検出し、ノイズ区間について時間軸を逆にミラーリングして補正

②レコード盤の繰返し再生による溝劣化(針および、微細ほこり等による溝の引っかき傷)による短い区間の比較的小さなレベルのクラックノイズ

 微分波形に含まれる高い周波数成分を検出し、ノイズ区間を直線補間後スムージングして補正


上記の補正方法は、デジタルオーディオの世界で、データが欠落した場合に使われる補間方法です。ノイズの検出条件、補間方法に興味ある方は、ソースコードおよび、そのコメント部をご覧ください。


これでも、拍手・シンバル・ボーカルによっては、影響を受けることがあるので、3レベルに分けたノイズ除去ができるようにしました。ノイズを完全に除去することをできませんが、かなり低減できると思います。


"0" 目立つノイズがある

"1" ノイズレベルが低いが気になるノイズ

"2" 激しいノイズレベル


除去部分の確認には、「Audacity」で、原音と上下反転させたノイズ除去後の信号をmix downして保存すれば、除去された雑音のみを確認できますので、最適なレベルを選択してください。次は、ベートーベン交響曲第九番の冒頭部分の原音と除去できたノイズの例です。



レコードノイズクリーナー(cleaner.exe)ベータ版V0.9(ZIPファイル)

をソースコードと実行形式で公開します。非商用の範囲で自己責任でご使用ください。なお、オリジナル・改訂版を含め、再配布される場合は、ソースコード・ライセンス条件を同梱していただけるようお願いします。


このツールは、Windowsのコマンドプロンプトから使用しますが、下記は、そのパラメータの仕様です。

Command Line:
cleaner.exe [-{v|vv|vvv}] [wav_file_name [ output_fname 
 [ click_level [ crackle_level [ {p|n}{p|n}... ]]]]]
  options:
      v   -> verbose log output
      vv  -> verbose detailed log output
      vvv -> verbose full log output
  arguments:
      wav_file_name -> 24bit stereo WAVE file name
      output_fname  -> cleaned output file
      click_level -> 0:normal click noise
               1:light click noise
               2:havy click noise
      crackle_level -> 0:normal crackle noise
               1:light crackle noise
               2:havy crackle noise
      p | n | c -> 1st culumn for L-ch, 2nd culumn for R-ch, pnpn (default)
               p: apply positive click noise
               n: apply negative click noise
               c: apply crackle noise


オプション例:

2 2 ppnnppcc	レコード盤に深い傷、再生回数により盤面が荒れている場合	
0 2 pnnpcc	レコード盤に傷、再生回数により盤面が荒れている場合
0 0 pnnpcc	再生回数により盤面が荒れている場合
1		わずかなノイズが残っている場合
0 0 pnpn	レコード盤にノイズがある場合(オプションなし時のデフォルト設定)


今回は、MCカートリッジV-57(AT-312EP)の再生信号に絞って、様々な盤面状態のEP7枚、LP40枚のノイズ除去を行ってチューニングしました。他のカートリッジでは異なる結果になるかもしれませんが、了承ください。


アナログレコード音源をハイレゾでクリアに楽しむために、お役に立てれば幸いです。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~カートリッジの周波数特性測定

2020/04/26

 音源としてアナログレコードは、経験豊富な良い耳を持たないと、評価が難しい面があります。また、多くのカートリッジは、製造後かなりの年月が経っているため、ダンパなどの性能の劣化が予想されるため、まずは、定量的なカートリッジの評価を行い、それを基に好きな音のカートリッジを見つけていくことにしました。


評価方法は、リファレンス音源として「Ortofon Test Record」を評価対象のカートリッジの再生信号をデジタル化し、PCで分析することにしました。


このレコードは、それなりの値段しますが、どのプレーヤー・カートリッジでも再生系全体を評価可能にしてくれる点では、素晴らしい音源だと思います。逆にこれがなければ、評価ができませんでした。限られたカートリッジですが、「Ortofon Test Record」と、TASCAM DV-RA1000HDの組み合わせで評価を進めました。


登場させたカートリッジは、使用しているターンテーブルがリニアトラッキングですのでT4P規格のAudioTechnica AT311EP、Diatone MAG-57、Grado Blue2、Technics EPC-P202C EPC-P23、Pioneer PC-296、Kenwood V-57です。(192KHz、24bitサンプリングで収録した「Frequency Sweep 800 Hz - 50 kHz」があればどんな再生系でも分析可能です)


それぞれのカートリッジ仕様には、再生周波数範囲が記載されていますが、条件は様々で、比較が難しい面があります。また、互換針が発売されていますが、針によって特性が変わるのではないかと、興味がありました。


今回テストするカートリッジ EPC-P202C系列には、EPC-P22、P23、P24、P25、P27など、同じ針を使える兄弟が多くあります。互換針は、さすがPanasonicでワールドワイドで広く使われているため、スイス・ドイツなどの互換針メーカーが発売しているようです。さらに針には、針形状が円柱、楕円柱などのバリエーションがあります。

Pioneer PC-296も同じようにAudio TechnicaのAT-92E系列で、互換針があります。eBayで、EVGというブランドのレコード針を見かけました。EVGは、アメリカの補修部品サプライヤーのようで、商品説明では、日本製レコード針を提供しているようです。EVG PM2323Dは、Audio Technicaのようですし、EVG PM2855DとEVG PM2855DEは、JICOの可能性があります。


さて、「Ortofon Test Record」の「Frequency Sweep 800 Hz - 50 kHz」は、一定振幅で、RIAA補正がかかっていません。今回のように、RIAAイコライザー通してサンプリングしたため、逆RIAA補正をかける必要があります。当初、GPL音楽編集ソフトウェア「Audacity」を用い、PCMデータ上で逆RIAA補正をかけ、周波数分析ソフトウェア「WaveSpectra」で目視確認しました。周波数スペクトル特性が見れますが、カートリッジ特性として定量的な実効電圧・セパレーション・歪率は、計測できません。「WaveSpectra」の機能として歪率が表示できますが、十分ではありません。


そこで、アナログ回路シミュレータの定番「LTSpice Ⅳ」を利用できないかと検討した結果、過渡応答分析で、逆RIAA補正・実効電圧計・セパレーション計・歪率計をソフト的に実現することができました。解析時間はかかりますが、測定器を比較的簡単に実現できたことは、驚きでした。プロフェッショナルだとMATLABを使うのではないでしょうか。


28秒間の「Frequency Sweep 800 Hz - 50 kHz」192KHz 24bit PCM(sweep.wav)を切り出した後、過渡応答シミュレーションは、次の4ステップに分けておこないました。処理内容に興味がある方は、公開したascファイル(回路図)を参照ください。


①逆RIAA補正(riaa_ieq.asc、sweep.wav -> sweep_ieq.wav)

 800Hz~50KHzのBPF後、製作したイコライザーの逆NFを行いカートリッジ出力相当の信号をwavファイルに保存


②基本周波数除去(歪成分抽出)(sweep_thd.asc、sweep_ieq.wav -> sweep_thd.wav)

 800Hz~50KHzのBPF後、基本周波数を抽出するため、ゼロクロス検出によるF-V変換を行い、電圧でノッチ周波数を可変にしたツインTノッチフィルターをわずかにノッチ周波数をずらした2段構成で、基本周波数を除去し、歪成分信号ををwavファイルに保存


「WaveSpectra」で歪成分信号を見ると高調波成分分布の確認が可能


③実効出力電圧・セパレーション・歪率の計算(sweep_sep_thd.asc、sweep_ieq.wav, sweep_thd.wav -> sweep_sep_thd.wav)

 800Hz~50KHzのBPF後、カートリッジの実効出力電圧、左右のカートリッジの実効出力電圧比からセパレーション、カートリッジ出力信号と歪成分信号の実効出力電圧比から歪率を求め、wavファイルに保存


④グラフ化(RecordCartridge.xlsm)

 EXECLのVBA(Mainマクロ)によりsweep_sep_thd.wavファイルを読み込み、校正信号による補正(高域の減衰補正)を行い、出力電圧・セパレーション・歪率の周波数特性をグラフ化


LTSpiceには、64ビット版もありますが、LTSpice 64ビット版では、wavファイルの入出力に問題があったため、32ビット版「LTSpice Ⅳ」を用いました。32ビット版ですので、メモリ制限があるため、オプション"Marching Waveforms"を無効にしてTransient解析を行う必要があります。十分なディスク容量も必要になります。3.4GHz 4-Coreで8時間程度の時間が必要ですが、出力は、wavファイルに出力されます。この出力をExcelに読み込むVBAを作成し、グラフ化しました。


「Ortofon Test Record」の再生信号をA/D変換した192kHz24bitのwavファイルからカートリッジの実効出力電圧・セパレーション・歪率を計測できる「LTSpice Ⅳ」ascファイル一式ベータ版V0.9(ZIPファイル)を公開します。非商用の範囲で自己責任でご使用ください。なお、オリジナル・改訂版を含め、再配布される場合は、ライセンス条件のコメントを消さずお願いします。

以上のように、「Ortofon Test Record」+A/Dコンバータ+LTspice+EXCELで、どんなカートリッジでもその周波数特性の実力を大まかに知ることができることが確認できました。他の測定器を用いた結果との比較はできていませんが、数をこなした結果、それなりの周波数特性が確認できるのではないかと思います。いつかLTspiceの代わりにプログラムを作成してみたいのですが、いつになるか定かではありません。


V-57+EVG PM2323D

Grado Prestige Blue2

EPC-P202C+Technics EPS-202DE(ボロンカンチレバー+楕円柱の中古)

EPC-P202C+Technics EPS-23ES(楕円柱の中古)

EPC-P202C+Generic EPS-24ES(楕円柱)

EPC-P202C+EVG PM2855DE(楕円柱)

EPC-P202C+EVG PM2855D

EPC-P23+Technics EPS-23ES(楕円柱の中古)

EPC-P23+Generic EPS-24ES(楕円柱)

EPC-P23+EVG PM2855DE(楕円柱)

EPC-P23+EVG PM2855D

PC-296+Audio Technica ATN3472SE(楕円柱)

PC-296+JICO 30-45

PC-296+3D-57M

MAG-57+Audio Technica ATN3472SE(楕円柱)

MAG-57+JICO 30-45

MAG-57+3D-57M

AT311EP+Audio Technica ATN3472SE(楕円柱)


テスト結果のPDF
を参考までに添付します。


評価のまとめとしては、

・Audio TechnicaのVMは、歪が少ない傾向にある

・Audio TechnicaのVMは、振動子実効質量が大きいため、楕円針の性能を出せていない。円錐針の方がバランスが良いかもしれない

・Audio TechnicaのVMは、10KHz台で出力が減衰し始めるが、なだらかで高域を稼いでいる

・TechnicsのMMは、20KHzまで高域が伸びているが、その後の減衰は大きい傾向がある

・TechnicsのMMは、セパレーションが良い傾向がある

・TechnicsのMM用の海外互換針は、20KHz付近でピークが出ている

・GradoのMIは、きれいに高域まで伸びているが、セパレーションに多くのピークが出ている

・MCは、高域まで伸び、バランスが良い

・ダンパが劣化するとセパレーションまたは、高域特性が出なくなる傾向があるようである


比較的バランスが取れたカートリッジ特性の例は、


V-57+EVG PM2323D

Grado Prestige Blue2

EPC-P202C+Generic EPS-24ES(楕円柱)

EPC-P23+Technics EPS-23ES(楕円柱の中古)

PC-296+Audio Technica ATN3472SE(楕円柱)

MAG-57+3D-57M

AT311EP+Audio Technica ATN3472SE(楕円柱)


出力電圧・セパレーション・歪率だけではなく音質に係わるパラメーターにコンプライアンスがあります。

V-57で10x10-6cm/dyne、EPC-P202Cで12x10-6cm/dyne(100Hz)、GradoPrestigeBlue2で20x10-6cm/dyneですので、GradoPrestigeBlue2は、クラシックで滑らかな音調を醸し出すようです。


以上、総合的なバランスから、MCで針交換ができるV-57+EVG PM2323Dが良いように感じられました。このV-57(AT-312EP)は、針交換ができるMCとして革新的ですが、発売当時は正統派MCと比べ音質が中途半端と評価されて人気がなかったように思えます。今回の評価結果を含め、コストパフォーマンスが良いハイレゾ音源用として実用性が個人的に気に入っています。


カートリッジの癖を頭に入れながら、アナログレコード音源をデジタル化して楽しみたいと思います。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~レーベルカバーの自作

2020/04/25

 さて、次はレコード盤の調達です。身近なハードオフや、ヤフオクからCD化されている比較的新しいレコード盤に注目しました。CDとの聴き比べができるようになります。聞きなれたクラシックから交響曲・ピアノソナタ・ピアノ協奏曲・バイオリン協奏曲、洋楽からビートルズの中古盤を入手しました。ジャケットの汚れは良いのですが、中古盤面を見ていくと、汚れ・埃・カビなどが非常に気になりました。そこで、中古のレコード盤をすべて洗浄することにしました。


ネットを調べると、念入りな洗浄のためにレコードレーベルカバーなるものが便利であることがわかりました。通信販売を調べると、それほど安くはありませんので、自作できないかと、ネット・ホームセンター・100円均一ショップなど足を運びながら調べたところ、使えそうな部材を見つかりました。

①線径3.5mm×外径110mmのオイルパッキン(eBayでRed Silicone O Ring Seals Tree 110mm x 104mm x 3.5mm、2本で送料込147円)

②セリア 4号サイズ用ケーキ型の底板(3個、324円)

③直径75mmキャスターベース(266円)

④長さ35mmステンM6ボルト+チェンジノブ(30+98円)

⑤M6ボルト用キーパーワッシャー(236円)

⑥M6直径20mm握り玉(65円)

⑦セメダイン・スーパーX接着剤(298円)

購入先によって多少の金額差があると思いますが合計で1,500円程度で、集めることができると思います。





組み立て方は、

①ケーキ型の底板3枚は、薄いので、慎重に1.5mm~6mmまでのドリルで真ん中に少しずつ穴を大きく開け、最後はやすりでバリ取りを行う。

②キャスターベースの真ん中に1.5mm~6mmまでのドリルで真ん中に少しずつ穴を大きく開け、最後はやすりでバリ取りを行う。

③ケーキ型の底板2枚それぞれに凹面にキャスターベースをエポキシ接着剤でM6ボルトが通る状態で接着する

④オイルパッキンの片側を紙やすりで表面を荒くする

⑤オイルパッキンを接着したいケーキ型の底板の凸側のパッキンが当たる部分にスーパーXを塗布する

⑥仮止め用にスーパーXを塗布していないケーキ型の底板を用意し、2枚の底板の凸側同士を向き合って仮止め用に適当なM6ボルトでパッキンがちょうど入る隙間を開けておく

⑦表面を荒くした側のオイルパッキン面と接着剤を塗布した側の底板を合わせながら、隙間にパッキンを伸ばしながら入れる

⑧均一に入り、底板の凸部分に引っかかっていることを確認した後、ボルトを少し閉めて、パッキンが少し押される状態で一晩おく



⑨接着剤が固まったら慎重に仮止め側の底板とパッキンの間を薄いドライバなどで少しずつ外す

⑩接着剤が不足気味の部分にスーパーXを少量充填する

⑪もう一枚の底板も同様にパッキンを接着する

⑫握り玉のボルトの口をやすりで2~3ミリ削り、1枚の底板のキャスターベースにエポキシ接着剤で接着し、ナットと一体化する

⑬M6ボルトをチェンジノブに入れ、キーパーワッシャーを通す、ナットを取り付けていない底板を入れる、レコード盤を通し、ナット付の底板でしっかり締めて、防水が完了する



ボルトがレコード盤の穴を傷つけないように、適当な直径の熱収縮チューブを適当な長さに切って、保護するようにしています。


これで、LP盤用のレコードレーベルカバーが完成です。この他に、洗浄剤は、50ccの水にマジックリンを5~10滴、システマ歯ブラシ、水拭きにに「セリア 毛羽立ちにくいコットンパフ」、レコード盤を乾かす「セリア ワイヤーふきんかけ」とレコード盤の穴に入れて乾かすための割りばしを用意しました。



洗浄作業は、テーブルに段ボール用の荷造りテープを1巻置き、その穴にナット付の底板をかぶせて、作業しやすいようにします。あとは、洗浄液をシステマ歯ブラシで優しく円周状に垂れない程度にブラッシングします。



何周か回して汚れを落とし、反対側も同じ要領できれいにします。浄水器の水で洗剤を洗い流した後、コットンパフで水をふき取り、割りばしとワイヤーふきんかけにレコード盤3枚まで吊るし乾燥させます。今回は、100円均一に結構お世話になりました。


せっせと水洗いしたところ、レコード盤は、キラキラと非常にきれいになりました。併せてレコード盤の内袋とジャケットカバーを新調しました。その後着いたほこりには、オーム電機「レコード除電ブラシ」がおすすめです。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~悩ましいOPAMPのDC出力電圧

2020/04/24

 今回のRIAAフォノイコライザーは、DCアンプ動作が基本となるので、無音状態のカートリッジを接続しても、DC出力電圧が発生してします。好ましくないため、LT1028Aおよび、LME49710の選別で、ある程度低減できましたが、電源投入後のふらつきと、MM/MCの切替で変わってしまうなど、問題が残ります。


今回使用したLT1028Aデータシート中の応用回路例では、DCカットコンデンサー入っていませんでしたので安心していましたが、気になったのでデータシートを調べてみると、LT1028Aはバイアス電流が、±30nA(Typ.)と思ったより少ない値でした。ところがLT1028Aの入力段トランジスタのバイアス電流は、雑音特性を良くするため、なんと4.5uA必要になっているようです。さらに調べてみると内部バイアス電流補償回路で、±30nA(Typ.)に抑え込んでいました。


ここで、30nAでもMMカートリッジでは、500Ω程度の直流抵抗があるため、15uVのオフセット入力電圧を発生させてしまい、MMでは、1,000倍の直流ゲインがあるため、15mVのDC出力電圧を発生させてしまいます。MCでは、10Ω程度の直流抵抗があるため、影響は少なくなります。いずれにしても、カートリッジに直流電流が流れることになるので、好ましいわけではありません。


FET入力OPAMPに乗せ換えると、バイアス電流が減りMMカートリッジでは、出力電圧の問題はありませんが、MCカートリッジの雑音特性が犠牲になります。悩ましいことです。


そこで、外部バイアス補償回路を考えてみることにしました。MMカートリッジを接続していない状態で、入力端子のオフセット電圧を測定すると、-0.8mV~-1.1mV(47KΩに発生するバイアス電圧)でした。この値であると、20nA程度のバイアス電流の吸い込みがあることが計算で求まります。具体的な外部バイアス補償回路は、入力抵抗47kΩのGND側にわずかな補正電圧をかけ、バイアス電流を相殺させることにしました。±50nA程度までトリマで調整できるようにしたところ、±0.1mV以下に追い込むことができましたので、2nA以下にできたことになります。補正電流の生成には、雑音源となる可能性があるツェナーダイオードではなくJFETによる定電流源を用い、さらに分流させて100Ωのトリマ抵抗に流し込みました。


さて、入力側でOPAMPのバイアス電流に注目しましたが、同じように出力側でよく問題になるのは、入力オフセット電圧です。これは、電源電圧・温度・個体差によってかなり変化します。今回のイコライザーは、高いゲインのDCアンプ構成ですのでなおさらです。オフセット電圧が小さい個体を選びましたが、オフセット電圧は、ふらつきが大きく、数10mVをうろうろしていました。これまた出力にDCカットコンデンサーを入れている例がありますが、音質に影響が出る可能性がありますので。DCサーボ回路を追加して、抑え込むことにしました。DCサーボといっても、OPAMP、抵抗、コンデンサーが必要で、オーディオ信号が積分されるため、歪源になりかねませんので、

①比較的低オフセット電圧で、オーデイォ用のOPAMPを使用する

②コンデンサーは、オーデイォ用を使用する

③ノイズ混入を避けるためフィードバックポイントは2段目のOPAMPの入力にし、ゲインを0.2倍程度に設定する(補正電圧範囲は±20%で、応答時間が5倍になる)


これで、雑音特性を犠牲にせず、数mVのオフセット出力電圧に抑え込めました。これで入力・出力コンデンサを不要にできました。下記が最終回路になります。



当初は、MMCF10基板のみで実現する予定でしたが、想定より多くの追加回路が必要になり、2つの外部基板を追加しました。スペースが限られているため、ユニバーサル面実装基板を用いました。全回路を1枚の基板にできたらいいのにとも思いました。


下記は、少し混雑ぎみのケース内部です。



PCで、192KHz24bitサンプリングを行い、用意しておいた「メンデルスゾーンのバイオリン協奏曲」とGrado Blue2で周波数スペクトル分析すると、Grado Blue2は、スペック通り、結構高い周波数まで伸びていました。ただ、PCによるサンプリングでは、PCが発生する雑音が回り込み、評価しにくいことがわかりました。


そこで、準備しておいた格安の中古TASCAM DV-RA1000HDを登場させることにしました。

デジタルサンプリング後、周波数分析ソフトウェア「WaveSpectra」で目視確認しました。

ピーク表示機能を使うと、周波数特性がきれいに出せます。


問題なくデジタルサンプリングできることがわかりましたので、SN比を計測してみることにしました。ターンテーブルにカートリッジを装着し、モーター駆動なしで電源を入れた無信号状態の信号を30秒間サンプリングしました。


下記は、MMカートリッジの場合です。



下記は、MCカートリッジの場合です。



外来ノイズ込みで、MMカートリッジの場合、-112dB@1KHz、MCカートリッジの場合、-98dB@1KHzでした。特定のノイズピークもなく、きれいな特性ではないでしょうか。


イコライザーの標準最大出力電圧を-6dB@1KHzに設定していますので、MMカートリッジの場合、SN比106dB@1KHz、MCカートリッジの場合、SN比92dB@1KHzとなります。当初の目標を十分クリアできているのではないかと思います。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~MM/MC フォノイコライザーの設計・製作

2020/04/23

 アナログレコードを聞くためには、フォノイコライザーが必須です。性能が良いMM/MC対応RIAAイコライザーは、価格が高いので、自作することにしました。


設計目標は、

①MC/MM対応とする

 SWで、入力インピーダンス(100Ω~47KΩ)・アンプゲイン(60dB~40dB@1KHz)を切り替える

②電源ノイズを最小限にするため、電池駆動とする

 006P型リチウムイオン電池を2個搭載し、電源電圧を±7.4V(公称)とする

③電池電圧が限られているなかで、十分なダイナミックレンジを確保する

 CR型であると、初段アンプの出力電圧が確保できないためNF型にする

③入手可能なRIAAイコライザ基板を活用する

 eBayからMMCF10という1回路OPAMPを4個使用したNF型基板が見つかったので、採用する

④RIAAの偏差を入手可能なCR部品でDC~100KHzで±0.2dB偏差で回路設計する

 RIAAネットワークに若松通商から、27KΩ(F)、3.9KΩ(F)、0.027uF(G)、0.082uF(F)を採用する

⑤MCカートリッジ用として、SL-10の仕様S/N比70dB@1KHz以上を目標とする

 低ノイズOPAMPの中から等価入力ノイズ電圧0.1uVを達成できる、LT1115または、LT1028Aを採用し、MCカートリッジ出力電圧に対するS/N比72dBを確保する

⑥念のため、サブソニックフィルターを使用できる


下記は、オリジナルのMMCF10基板です。



参考までに、オリジナルのMMCF10イコライザー部回路ですが、MM専用です。。



MMCF10基板は、RIAAイコライザーとAC整流+3端子レギュレーターから成る電源部分からできていますが、今回は、リチウムイオン電池を使用するので、不要な電源部分をカットします。また、NFフィードバック回路が異なるため、箔カットとドリル穴開けを追加します。これくらいの改造で済むのはありがたいことです。


LTSpiceでシミュレーションを行い、下記のようなRIAA EQ回路としました。



さらに、次の電源回路(リチウムイオン電池の充電回路)ユニバーサル基板で組み立てました。



次に、006P型リチウムイオン電池2個、トグルスイッチ(MM/MC切替、サブソニックフィルター切替、充電+電源)、RCAジャック、ACアダプター用DCジャック、GND端子、LEDなどの部品を格納できるケースを選定します。できるだけ小型にまとめるため、タカチのMB型アルミケース【MB11-3-14】(旧型番:MB-52)高さ:30mm・幅:110mm・奥行:140mmを選定しました。


電源スイッチには、トグルスイッチ 4極 ON-OFF-ON【MS500RB】を使用しました。ONポジションでイコライザーに電源を供給し、片側のみのONポジションで、充電回路を接続する構成にしました。MM/MC切替、サブソニックフィルター切替には、トグルスイッチ 4極 ON-ON【MS500PB】を使用しました。スイッチの使用感を合わせるために、サブソニックフィルター切替は、2回路のみの使用としました。


下記は、その外観です。


(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~Technics SL-7、Kenwood KP-727の整備

2020/04/22

 まず、Technics SL-7の補修です。

まずオーナーマニュアルとサービスマニュアルを探しダウンロードしました。動作状態は、例のごとくアームドライブのゴムベルトが硬化してスリップ状態でしたので、千石電商から1.2mm□、25φのゴムベルトを入手し、交換しました。次は、ビスに付属のゴムワッシャーの交換です。パソコンHDD用のゴム付インチビスのゴムを流用しました。さらに、内部基板類をチェックし、電解コンデンサーの液漏れ等がないことを確認し、問題があれば交換します。幸い、問題ありませんでした。


最後は、内部清掃と汚れ・擦り傷落としです。マジックリンの雑巾で内部清掃を行います。次にキャビネット・コードの汚れ・擦り傷をマジックリン・レクトラクリーン・プラスティックコンパウンドできれいにし、黒マジックでタッチペイントして終了です。


次は、Kenwood KP-727の補修です。

残念ながら、オーナーマニュアルとサービスマニュアルは、見つかりませんでした。動作状態は、同じくアームドライブのゴムベルトが硬化してスリップ状態でしたので、千石電商から0.95mm□、25φのゴムベルトを入手し、交換しました。

次に、補修が必要な部分は、ゴム足です。ゴム足がひび割れ、高さがつぶれ気味の足もありました。補修は、まず、靴底補修接着剤(シューズドクターN)をひび割れ部分に精密ドラーバーや楊枝で塗り込みます。これで全体的に強度が戻ります。高さがつぶれた足には、1mm厚のゴムをリング状に切って、同じ接着剤でカサ上げをし、4本の足の高さを調整します。さらに、内部基板類をチェックし、電解コンデンサーの液漏れ等がないことを確認し、問題があれば交換します。幸い、問題ありませんでした。


最後は、内部清掃と汚れ・擦り傷落としです。マジックリンの雑巾で内部清掃を行います。次にキャビネット・コードの汚れ・擦り傷をマジックリン・レクトラクリーン・プラスティックコンパウンドできれいにし、黒マジックでタッチペイントして終了です。


両者ともに、レコード針は、古くなっていたり、針が折れていたので、eBayで、互換針を発注しました。

(再クロール更新:2022/12/22)

アナログレコードをハイレゾで楽む~導入編

2020/04/21

 新型コロナで騒がしい中ですが、久々にオーディオのブログ投稿をしたいと思います。


これまで、時代の主流のCD、SACDをレトロな自作真空管アンプで楽しんできました。真空管アンプは、スピーカーとの組み合わせと、真空管や回路の種類・組み合わせにより、適度な歪と出力インピーダンスによって、微妙な臨場感・音色を醸し出しています。


一方、CD、SACDは、マスター音源をデジタル技術を通して、ミキシングエンジニアがこれが良いのではないかと考えた再生音源に再現性高く提供してくれます。この再生音源を真空管アンプとスピーカーによる色付けで楽しんできたことになります。CDの20KHz以上の欠落周波数帯の問題の回答として、SACDが発売され、周波数帯の欠落がない良い音ではありますが、再現性が高いが故にマスター音源の良し悪しを引きついで、ある意味面白みが少ない再生音源になっているように感じられてしかたがありません。そこで、音源として色付けの範囲が広いアナログレコードを試してみることにしました。


アナログレコードもオーディオの常でピンキリの世界です。最小限の原資と自己努力(自己満足)が活かせ、お手軽に楽しめる導入計画を練りました。


まず条件を考えてみました。

①アナログ技術が成熟していた往年の機器であること

②機械的な劣化が致命傷になりにくい技術であること

③レコードカートリッジの針が入手できること

④CDのように手軽な操作・メンテナンスができること

⑤デジタル技術で、基本性能の評価を行い、良い音にできること


以上より、ヤフオクなど調べると、ターンテーブルの成熟期に各社が発売したリニアトラッキング方式 レコードプレーヤーがお手軽であることがわかりました。特に、ジャケットサイズのTechnicsのSL-10は、成熟したDDドライブとカートリッジを採用し省スペースで魅力的でした。ところが問題は、MCカートリッジであるため、レコード針の交換ができません。そこで、レコード針の入手性が良いMMカートリッジを搭載したTechnicsのSL-7にターゲットを絞りました。リニアトラッキング方式の場合、T4P規格というメーカー間の互換性が高いカートリッジが使われていますので、この点も評価できます。(反面、高級なカートリッジではありませんが、お手軽さには合っています。)


このSL-7は、MMカートリッジ(EPC-P202C)を採用していますが、ボロンカンチレバーのEPS-202EDが入手できないので、周波数特性を考えると、MCカートリッジも非常に気になりました。各社のリニアトラッキング方式 レコードプレーヤーを調べていくと、MCカートリッジを採用したKenwoodの機種が見つかりました。針交換可能なMCカートリッジ(V-57、AT312EPのOEM)を採用したKP-727です。交換用の針は、eBayで入手可能でした。EVGのPM2323Dですが、中身はAudio Technicaのオリジナルのようです。


それぞれ、ヤフオクとメルカリから動作不良のジャンク品を中古カートリッジ価格相当で入手しました。以上で、①~④が実現できます。⑤については、Ortofonの「Test Record」を使い、パソコンのサウンドキャプチャ機能+「WaveSpectra」で解析することにしました。

(再クロール更新:2022/12/22)