Windows 11へのアップデート準備(TPM 2.0の有効化)

昨年7月にWindows PCを組み立てました。

marui.hatenablog.com

10月5日にWindows 11がリリースされたのですが、「設定」→「更新とセキュリティ」→「Windows Update」を見ると「このPCは現在、Windows 11のすべてのシステム要件を満たしていません」などと表示されます。PC正常性チェックアプリというのをダウンロードしてどこに問題があるのかを確認しないといけなくなりました。

アプリで確認したところ、TPM 2.0が有効になっていないとのこと。TPMというのはTrusted Platform Moduleの略で、セキュリティに関するハードウェアです。MacでいうところのT2チップとかに相当するのかな。ここ5年以内に出荷されたマシンであればTPM 2.0に対応しているっぽいので、昨年買ったマザーボードも大丈夫なはず。

pc.watch.impress.co.jp

「設定」→「更新とセキュリティ」→「回復」→(「PCの起動をカスタマイズする」の下の)「今すぐ再起動」ボタンを押すと、「オプションの選択」画面に入ります。そこから「トラブルシューティング」→「詳細オプション」→「UEFIファームウェアの設定」→「再起動」を選択し、UEFI画面に入ります(昔で言うところのBIOS画面ですね)。

うちのマザーボードGIGABYTE H410M S2Hで、Advanced設定の中にあったSettings→その他→IntelTPMとしてはIntel Platform Trust Technology (PTT)を有効化して、保存&再起動しました。

PC正常性チェックアプリで確認したところ、ちゃんとTPM 2.0が有効になっていました(なぜかWindows Updateの画面には「このPCは現在、Windows 11のすべてのシステム要件を満たしていません」と表示されていますが)。あとはWindows 11への更新の順番が回ってくるのを待つだけです。

(ところでWindows 11のコードネームはSun Valleyなんだとか。三重県津市にあったショッピングセンターを思い出してしまいました……。)

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2020-09-21 11760.8 3.04 130.59 48.88 2.67
2021-02-21 11900.9 2.92 139.73 47.98 2.91
2021-03-12 12042.2 3.08 133.77 45.88 2.92
2021-05-03 12177.4 2.46 139.84 54.96 2.54
2021-06-06 12290.5 1.99 142.21 56.83 2.50
2021-07-31 12417.3 2.62 148.09 48.40 3.06
2021-09-25 12563.7 2.81 148.04 52.10 2.84

仕事からの帰り道で給油。COVID-19の影響で「県境をまたいではいけない」というお達しが職場から出ていたせいで、けっきょく夏休みには遠出はできず、街乗り程度にしか走れなかった……。友人とキャンプに行ったりしたかったんだけど、いつの間にか秋になってしまった。

Juliaで基音周波数の推定(続き)

先日、Juliaを使って基音周波数を推定する記事を書きました。

marui.hatenablog.com

その中で、基音よりも倍音成分のほうが振幅が大きいときのために自己相関関数を使用して対処するという説明をしましたが、それではうまくいかない音があったので、別の方法を使うことにしたよというのが今日の記事です。

手元にあったエレキベースの4弦の解放音(E1の音、約41.20 Hz)です。時間波形を見ると30秒近くまでサスティンが伸びているのがわかります。

f:id:amarui:20210924125255p:plain

これを先日と同じようにFFTをかけて周波数スペクトルを見てみます。

f:id:amarui:20210924125325p:plain

すると、第2倍音・第4倍音が大きく出ているのがわかります。以下のように前回と同じコードを使って自己相関をとって20 Hz以下を無視したグラフを描いたところ……

yc = xcorr(y, y);
yc = yc[length(yc)÷2+1 : end];
yc = yc ./ maximum(yc);

lowfreq = 20;
yc2 = yc[f .>= lowfreq];
fc2 = f[f .>= lowfreq];

plot(fc2[1:50000], yc2[1:50000],
  xlabel="Frequency (Hz)", ylabel="Correlation", legend=false)

f:id:amarui:20210924125607p:plain

相関値が最も高いのは基音ではなく第2倍音となってしまいました。ここでfindmax()でピーク周波数を求めると83 Hzとなり、1オクターブずれた結果になってしまいます。

自己相関関数だとうまくいかない場合もあるということで、やりかたを変えてみます。ネットで少し調べたところHarmonic Product Spectrumというテクニックがあることがわかりました。下の図はリンク先からお借りしたものですが、スペクトルを周波数方向に1/2、1/3……と縮めながら積をとることで基音周波数の成分だけが突出するようになるという概念図になっています。

f:id:amarui:20210924130444p:plain

これをそのまま実装したのが次のコードです。DSP.resample()関数を使ってスペクトルを徐々に縮めて、yc周波数スペクトルの積を入れていきます。第5倍音くらいまででも十分なようですが、以下では第10倍音までの積を取るようにしています。

yc = copy(y);
for n = 2:10
  yr = resample(y, 1/n);
  yr[isnan.(yr)] .= 0;
  yc[1:length(yr)] .*= yr;
end

これで計算したHarmonic Product Spectrumが以下のグラフです。 f:id:amarui:20210924131511p:plain

一か所だけが突出しているのがわかります。ピーク部分付近だけを拡大すると…… f:id:amarui:20210924131540p:plain

ここから基音周波数は41.52 Hzだと推定されました。正確なE1からは13~14セントくらいずれていますので、チューニングをしっかりやらないとですね。

Juliaで基音周波数の推定

2021-09-24追記:正確に基音周波数が推定できない音があったので、別記事に対策を書きました。Juliaで基音周波数の推定(続き) - 丸井綜研

ピッチを感じる楽器の音は、基音と倍音とその他の成分音からなっています。どんな成分が入っているのか分析したいときには「楽器音の分析とスペクトログラム (Julia Advent Calendar 2018) - 丸井綜研」をぜひ。

ところで楽器音のピッチは基音の周波数と一致することが多いので、ピッチを知りたいときには基音の周波数を推定します。今日は基音の周波数を推定するためのごく簡単な方法を紹介します。

音を読み込む、処理する、可視化する、といったことをしたいので、必要なパッケージを読み込みます。

using FileIO: load
import LibSndFile
using DSP, FFTW
using Plots
pyplot();

音信号をファイルから読み込むのにはLibSndFile.load()を使います。今回はクラシックギターの1弦の開放音を読み込みます。

snd = load("guitar.wav")

読み込んだ信号の波形を見てみましょう。波形はsnd.data、標本化周波数はsnd.samplerateに入っていますが、名前が長いのでそれぞれxfsに代入して使うことにします(モノラルファイルではない場合には1チャンネル目だけを使います)。tは各サンプルの時刻を秒単位であらわしたものです。

x = snd.data;
if length(size(x)) > 1
  x = x[:,1];
end
fs = snd.samplerate;
t = range(0, length(x)-1, step=1) ./ fs;
plot(t, x, ylim=[-1, +1],
  xlabel="Time (sec)", ylabel="Amplitude", legend=false)

f:id:amarui:20210922145111p:plain

一回の撥弦音が収録されているのがわかります。

倍音成分を見るために、フーリエ変換を使って周波数スペクトルの計算をします。普通のFFTを使ってもいいのですが、負の周波数成分が出てこなくて手軽なFFTW.rfft()を使い、振幅を計算します。正確な振幅値を得るためには信号長で補正をかけたりするんですが、今回は振幅の絶対的な値には興味がないので無視します。fはスペクトルの各周波数ビンの中心周波数です。(普通のFFTを使った分析については「パワースペクトル計算の2つの方法 (Julia Advent Calendar 2019) - 丸井綜研」に書きました)

y = abs.(rfft(x));
f = range(0, stop=fs/2, length=length(y));
plot(f, y,
  xlabel="Frequency (Hz)", ylabel="Amplitude", legend=false)

f:id:amarui:20210922145208p:plain

低い周波数に何本かピークがあるのがわかります。拡大表示してみましょう。

plot(f[1:50000], y[1:50000],
  xlabel="Frequency (Hz)", ylabel="Amplitude", legend=false)

f:id:amarui:20210922145319p:plain

倍音成分が330 Hz付近、660Hz付近、990 Hz付近……に出ています。基音の成分が突出しているので、振幅が最大値になる周波数を求めれば基音周波数が推定できそうです。

(val, ind) = findmax(y)
f[ind]

とすると、330.96 Hzという結果でした。A4を440 Hzに合わせたとするとE4は329.6 Hzですから、だいたい正しい周波数が推定できてそうです。しかし、楽器によっては基音よりも第2倍音や第3倍音が振幅が大きい場合もあります。その場合、上記のようにスペクトルの最大値だけを見てしまうと、基音の周波数ではなく第2倍音や第3倍音の周波数を検出してしまいます。

そこで、スペクトルの自己相関関数を計算します。ピッチを持つ楽器では多くの場合、倍音成分は基音の整数倍の周波数にあらわれます。周波数軸上で等間隔に並んでいるので、自己相関を計算すればその周期を検出できるわけです。自己相関の計算には相互相関関数を使いますが、結果が対象になるので、片側半分だけを取り出します。

yc = xcorr(y, y);
yc = yc[length(yc)÷2+1 : end];
yc = yc ./ maximum(yc);
plot(f[1:50000], yc[1:50000],
  xlabel="Frequency (Hz)", ylabel="Correlation", legend=false)

f:id:amarui:20210922145439p:plain

ちょうど330 Hz付近にピークがあります。自己相関なので当然ながらシフト量がゼロのときが相関最大になります。これを除去しないとfindmax()が使えませんので、下記のようにlowfreqという変数を用意して、その周波数以上の成分だけを検出対象にします。

lowfreq = 20;
yc2 = yc[f .>= lowfreq];
fc2 = f[f .>= lowfreq];
(val, ind) = findmax(yc2);
plot(fc2[ind-1000:ind+1000], yc2[ind-1000:ind+1000],
  xlabel="Frequency (Hz)", ylabel="Amplitude", legend=false)

f:id:amarui:20210923110548p:plain

上のグラフは相関最大になった付近の拡大図です。もとのファイルの長さがけっこうあったので、FFTで得られたビン数も多く周波数分解能も高くなっています。ピークの周波数を見てみます。

fc2[ind]

結果、330.28 Hzと、基音周波数の推定ができました。

Juliaで手軽に基音周波数の推定をする簡単な方法を紹介しました。自分が手元で使っているコードでは、入力信号が短い場合はゼロ詰めして周波数分解能を上げるという処理を加えたものを関数化しています。

基音周波数推定は奥が深く、リアルタイム動作に適した洗練された方法も提案されていますので、興味がある方は調べてみてください。(たとえばDOI: 10.1121/1.1458024とかが有名です)

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2020-09-21 11760.8 3.04 130.59 48.88 2.67
2021-02-21 11900.9 2.92 139.73 47.98 2.91
2021-03-12 12042.2 3.08 133.77 45.88 2.92
2021-05-03 12177.4 2.46 139.84 54.96 2.54
2021-06-06 12290.5 1.99 142.21 56.83 2.50
2021-07-31 12417.3 2.62 148.09 48.40 3.06

ここ1ヶ月のうちにバイクの点検をしてもらった。ペダルのゴムみたいな消耗品の交換に加えて、オイル交換してタイヤの空気圧を調整するていど。そろそろ9年になるけど丁寧に乗っているね、とのこと。

今日は、近所のバイク販売店を回って新車を見たり(バイクレンタル会員に申し込んでみた)、夕食の食材を仕入れてバターチキンカレーを作ったなど。