Raspberry Pi Audio
Raspberry Piでハイレゾ音源に挑戦中です。
音質についてのおさらい
ハイレゾとかローレゾとか言われていますが、音質についてのおさらいをします。デジタルの世界では「サンプリング周波数」と「量子化ビット数」で音質の性能をあらわします。
まず「サンプリング周波数」とは、アナログ・16ビットデジタル変換(AD変換)するときに1秒間に何回変換する(標本化する)かの回数のことを指します。これは音の分割を意味し、44.1Khzである音楽CDであれば、1秒の音を4万4100件のデータに変換しているのです。回数が多いほど精度が高くオリジナルの音に近づきます。もちろんデータ量は増加します。
もうひとつの「量子化ビット数」は、AD変換時のデータを何段階で表現するかを示すものです。画像で言うと何色で画像を表現するのかと似ています。一般的にビット数で表現され、8ビットは256段階、16ビットは6万5536段階、24ビットは1677万7216段階。ビット数が大きいほど解像感に優れた緻密で繊細な音を再現できます。CDの場合、サンプリング周波数 44.1kHz、16bitと呼ばれるフォーマットになります。ビットレートの違いによる音質の違いはこのサイトで実際に視聴出来ます。
ちなみに、FM放送はFM変調を利用した情報伝達方法で音声圧縮方法では無いので、原音をそのまま家庭に届けていると思います。ただし放送規定で15KHzまでになっていますので15KHz以上はカットされています。また生放送でないものはDATに録音してから放送されると言うことですので、これを考慮しざっくりとデジタルで考えるとサンプリング周波数は32KHzで量子化ピットは16bitとなります。
おさらい2 ハイレゾにすれば全ては解決するのか?CD以降デジタル音源に変わり、音質は一般的に良くなったと言われております。ただし、サンプリング周波数で説明したように1秒間に44,100回だけ音をデータ抽出しているとも言えます。ですから残りの音は「廃棄」されています。一般的に耳の良い人が聴いてみると、1秒間をそのままレコードの溝に書き込んでいるアナログのほうが「廃棄」されているデータが少なく、レコードのほうが音質が良いと感じられる場合もあり得ます。ただし、レコードの場合はレコード針が毎回レコードの溝をゴシゴシこすっていくわけですから、物理的劣化は避けられません。CDの場合は直接針がCDに触れるわけではないので物理的劣化はないとは言えません(酸化とか紫外線による劣化の可能性は排除出来ず)が、レコードよりは劣化しにくい構造になっています。
また、音源をいくら良くしても、伝送路(いわゆるケーブル)やアンプ、スピーカーも改善しないと本当に良い音質は得られません。家電量販店のマニア向けオーディオ売り場に行くと、驚愕的な価格のスピーカーやケーブルが販売されています。結局バランスの問題です。パソコンも幾らCPUの性能を上げても搭載するメモリが少なかったり、遅いHDDだったりすると本来の性能が引き出せないのとよく似ています。オーディオにはまると大散財するといわれるのは、デジタルアナログ変換の最後の出口であるスピーカーの性能によるところが大きく、また、人それぞれスピーカーと自分の耳との相性があるためより高級なものを求めた結果、気がつけば…となることが多いようです。人間は鍛えればどんどん進化するので、最初は満足していたスピーカーが日比の鍛錬(毎日音楽を聴くことで)で耳の性能が向上してしまいます。(困った生物ですね)
Raspberry Pi – Internet RadioRaspberry Pi 3と拡張ボード(Apple Pi)が余っていたので、スピーカーと接続してインターネットラジオ受信機を仕立ててみました。 〇構成 Raspberry Piを使用したInternet Radioの構成を以下に示します。
おさらい2 ハイレゾにすれば全ては解決するのか?
CD以降デジタル音源に変わり、音質は一般的に良くなったと言われております。ただし、サンプリング周波数で説明したように1秒間に44,100回だけ音をデータ抽出しているとも言えます。ですから残りの音は「廃棄」されています。一般的に耳の良い人が聴いてみると、1秒間をそのままレコードの溝に書き込んでいるアナログのほうが「廃棄」されているデータが少なく、レコードのほうが音質が良いと感じられる場合もあり得ます。ただし、レコードの場合はレコード針が毎回レコードの溝をゴシゴシこすっていくわけですから、物理的劣化は避けられません。CDの場合は直接針がCDに触れるわけではないので物理的劣化はないとは言えません(酸化とか紫外線による劣化の可能性は排除出来ず)が、レコードよりは劣化しにくい構造になっています。
また、音源をいくら良くしても、伝送路(いわゆるケーブル)やアンプ、スピーカーも改善しないと本当に良い音質は得られません。家電量販店のマニア向けオーディオ売り場に行くと、驚愕的な価格のスピーカーやケーブルが販売されています。結局バランスの問題です。パソコンも幾らCPUの性能を上げても搭載するメモリが少なかったり、遅いHDDだったりすると本来の性能が引き出せないのとよく似ています。オーディオにはまると大散財するといわれるのは、デジタルアナログ変換の最後の出口であるスピーカーの性能によるところが大きく、また、人それぞれスピーカーと自分の耳との相性があるためより高級なものを求めた結果、気がつけば…となることが多いようです。人間は鍛えればどんどん進化するので、最初は満足していたスピーカーが日比の鍛錬(毎日音楽を聴くことで)で耳の性能が向上してしまいます。(困った生物ですね)
Raspberry Pi – Internet Radio
Raspberry Pi 3と拡張ボード(Apple Pi)が余っていたので、スピーカーと接続してインターネットラジオ受信機を仕立ててみました。
〇構成
Raspberry Piを使用したInternet Radioの構成を以下に示します。
実際の構成は以下のようになりました。
〇諸元
- RaspberryPiにVLCをインストールし、音源再生のためのメディアプレーヤーとして使用しています。
- ApplePiに実装されているD/Aコンバータ(192kHz)を使用し、ハイレゾ音源に対応しています。
- ApplePiに実装されている赤外線フォトトランジスタを使用し、リモコンによる操作を可能としています。
- 操作用のリモコンは、近くにある大須のパーツ屋に転がっていたテレビリモコン(赤外線)を使用しています。
- リモコンによる選局等の処理は、シェル(bash)により記述しています。
- リモコンのボタン押下により以下に示す操作が可能です。
————————-
”+”:選曲(UP)
”ー”:選曲(DOWN)
”消音”:停止(MUTE)
”電源”:電源OFF(SHUTDOWN
)”1”:サンプル音源再生(ハイレゾ
)”2”:サンプル音源再生(CD)
”3”:温度表示
”4”:湿度表示
”5”:気圧表示
登録されたラジオ局から選局し、再生可能となっています。選局可能なラジオ局を、局名、及びURLの一覧(以下に例を示す)としてテキストファイル形式で予め登録しています。
————————-
ArmiTunes https://mp3.fr.armitunes.com:8000Girls and Panz. Usagi mms://media64.web-radio.biz/usagi/16052750h.wsxBBC Radio 1 https://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio1_mf_p・・・・
————————-
再生中の様子です。
電源OFFは、電源遮断回路を未搭載のためOSのShutdownを実施するのみとなっています。(手動でACアダプタの電源をOFFにする必要があります。)
ハイレゾ音源と通常音源の聞き比べを行うためにサンプル音源(ハイレゾ(96kHz)音源と通常(48kHz)音源)を搭載し、再生可能にしました。
温度/湿度/気圧を表示できます。但し、センサ下にRaspberryPi本体があるため、温度が実際の気温よりかなり高く表示されます。同じ理由により湿度・気圧も不正確です。温度表示中の様子です。
〇制御用シェル
制御用のシェルはApplePi用のシェル(radio.sh)を参考にして、以下のように記述しています。(シェル内でApplePi用のスクリプト等を使用しております。)
!/bin/bash
base=/home/pi/bcm2835-1.50/ApplePi
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “Start “
I=0
A=”–alsa-audio-device=hw:0,0″
while [ 1 ]
do
S=”sudo $base/getIR2 -h
“
#
Input Select
#
if [ “${S}” = “NEC 100313” ]
then
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “ChangeCh”
A=”–alsa-audio-device=hw:1,0″
fi
#
+
#
if [ “${S}” = “NEC 100319” ]
then
if [ $I -lt 59 ]
then
I=expr $I + 1
echo Index=$I
$base/locateLCD 0 0
$base/printLCD “up “
echo head -n $I $base/stations.txt | tail -n 1
H=head -n $I $base/list.txt | tail -n 1
S=head -n $I $base/stations.txt | tail -n 1 | cut -d' ' -f1
$base/locateLCD 0 1
$base/printLCD ” “
$base/locateLCD 0 1
$base/printLCD $I
$base/locateLCD 3 1
$base/printLCD $S
pkill vlc
sleep 1
vlc -I dummy –quiet –aout alsa $A $H > /dev/null 2>&1 &
fi
fi
#
–
#
if [ “${S}” = “NEC 100318” ]
then
if [ $I -gt 1 ]
then
I=expr $I - 1
echo Index=$I
$base/locateLCD 0 0
$base/printLCD “down “
echo head -n $I $base/stations.txt | tail -n 1
H=head -n $I $base/list.txt | tail -n 1
S=head -n $I $base/stations.txt | tail -n 1 | cut -d' ' -f1
$base/locateLCD 0 1
$base/printLCD ” “
$base/locateLCD 0 1
$base/printLCD $I
$base/locateLCD 3 1
$base/printLCD $S
pkill vlc
sleep 1
vlc -I dummy –quiet –aout alsa $A $H > /dev/null 2>&1 &
fi
fi
#
消音(Mute)
#
if [ “${S}” = “NEC 10031C” ]
then
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “Stop “
pkill vlc
echo Stop
fi
#
電源(SHUTDOWN)
#
if [ “${S}” = “NEC 100317” ]
then
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “PowerOff”
sudo poweroff
fi
#
1(サンプル音源再生<ハイレゾ>)
#
if [ “${S}” = “NEC 100321” ]
then
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “PLAY “
$base/locateLCD 0 1
$base/printLCD “96kHz “
pkill vlc
sleep 1
vlc -I dummy –quiet –aout alsa $A $base/96_24.flac &
fi
#
2(サンプル音源再生)
#
if [ “${S}” = “NEC 100322” ]
then
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “PLAY “
$base/locateLCD 0 1
$base/printLCD “48kHz “
pkill vlc
sleep 1
vlc -I dummy –quiet –aout alsa $A $base/48_16.m4a &
fi
#
3(温度表示)
#
if [ “${S}” = “NEC 100323” ]
then
sudo $base/onLED1
t=$base/getBME -t
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “Temperat”
$base/locateLCD 0 1
$base/printLCD $t
sleep 1
sudo $base/offLED1
fi
#
4(湿度表示)
#
if [ “${S}” = “NEC 100324” ]
then
sudo $base/onLED2
h=$base/getBME -h
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “Humidity”
$base/locateLCD 0 1
$base/printLCD $h
sleep 1
sudo $base/offLED2
fi
#
5(気圧表示)
#
if [ “${S}” = “NEC 100325” ]
then
sudo $base/onLED1
sudo $base/onLED2
p=$base/getBME -p
$base/initLCD
$base/locateLCD 0 0
$base/printLCD “Pressure”
$base/locateLCD 0 1
$base/printLCD $p
sleep 1
sudo $base/offLED1
sudo $base/offLED2
fi
sleep 1
done
〇ちょっと失敗談
リモコンのボタンで電源OFF(shutdown)を行えるようにshutdownコマンドをシェルに登録し、crontabで電源ON(reboot)時に起動するように登録したところ、シェルのプログラミングミスで、電源ON後、直ぐに電源OFF(shutdown)となってしまう困ったシステムになってしまいました。このままでは何もできない…..(^_^;)上記の状態を抜け出すため、電源ON後にシングルユーザモードに移行し、シェルから電源OFF(shutdown)処理を削除しました。→なんとか無事に立ち上がるようになりました。
※シングルユーザモードへの移行方法を記述しておきます。①電源ON②(ラズベリーの)画面が表示されたら”shiftキー”を押下③設定画面になるので、cmdline.txtを選択④cmdline.txtの最後に”init=/bin/sh”を追加⑤設定画面をExit⑥電源OFF、電源ON⑦シングルユーザモードで立ち上がる⑧ファイルシステムへ書き込みできるようにマウントする# mount -o rw,remount /