こいけいろぐ

http://surf2koike.blog62.fc2.com/

2005年 06月 24日 SL-C3000のサウンド機能解析 - 隠された機能を探る -

前回前々回の記事に引き続き、SL-C3000のサウンド機能の解析です。

SL-C3000で採用されているサウンドチップの仕様書(「Wolfson Microelectronics WM8750 DATA SHEET」)を読むと、本チップは思いのほか多機能であることがわかります。

今回も、デバイスドライバのソースコード(主に、linux/drivers/sound/spitz_wm8750.c
)と見比べながら、Zaurusの実装を解析してみます。
linux/drivers/sound/pxa-i2s_spitz.c (PXA270のI2Sコントローラ用ドライバ) を読むと、以下に挙げた制御の他、汎用IOポート経由でも様々な制御を行なっているようです。ですので、以下の解析だけでは足りない部分があるかもしれません。

・DAC, ADC性能ほか

24bit Multibit ΔΣ DAC,
24bit Multibit ΔΣ ADC,
マイクアンプ、ヘッドホン(40mW)、スピーカーアンプ(400mW)を内蔵した、ポータブルオーディオ機器向けのサウンドチップです。

Zaurusでは、入出力データの語長は16bitに設定されます(R7レジスタ)。
DAC, ADCのオーバーサンプリングは選択可能で、低消費電力向けの64倍に設定されます(R24レジスタ)。S/N比を優先して、ここを128倍に設定変更することもできそうです。

・MIC BIAS(マイク電源供給)

コンデンサマイク向けの電源供給機能があります。
録音用にreadモードでopenすると、本機能が設定されます(R25レジスタ)。
Zaurusの取説には明記されていませんが、市販のプラグインパワー対応マイクを接続すると、電池なしで動作するかも知れません。

linux/drivers/sound/pxa-i2s_spitz.c には、録音時にread+writeモードでデバイスをopenすると、ヘッドセットが使えるような記述がありました。

・Automatic Level Control

マイク入力の音量に合わせて入力ゲインを自動調整します(R17-19レジスタ)。調整量は入力ボリューム設定値によって変化させるようです。

・3D Stereo Enhancement

ステレオ音に疑似的な広がり感を与える機能です。Zaurusではこの機能は常にオフになっています(R16レジスタ)。

・Graphic Equalizer (Tone Control)

高音、低音について増幅量が調整できます。Zaurusではこの機能は常にオフになっているようです。

・Power Management

電池の持ちをよくするため、不要な回路の電源をオフにする制御ができるようになっています。
再生時: ADC OFF, MIC BIAS OFF
録音時: ADC ON, MIC BIAS ON, 左Ch出力のみ電源オフ(この理由は全く不明???)

最後の部分のみちょっと引っかかりました。
SL-C3000では、マイク端子とヘッドホン端子を共用するので、出力は両Chとも電源オフでよいような気がするのですが... 何か深い理由でもあるのでしょうか。

スポンサーサイト

2005年 06月 22日 SL-C3000のサウンド機能解析 - 曲の先頭で入る「ボツ」音の原因を探る -

前回の記事に引き続き、SL-C3000のサウンド機能の解析です。

SL-C3000の"Music Player"アプリケーションでは、音楽再生時に曲の先頭や曲間で小さく「ボツ」という雑音が入ります。最初、この症状は"Music Player"固有の不具合によるものかと思っていたのですが、"MPlayer for Zaurus"など他のアプリケーションでも同じ症状が起きるので、これはZaurusそのものの不具合ではないか、と気になっていました。

前回の記事に書いた通り、私はZaurusの音質に好印象をもっているので、この不具合はなんとか対処したい(というか、製造元のシャープに対処してほしい)ところです。

そんなわけで、今回も解析してみました。解析材料は前回と同様です。

・デバイスドライバにバグ?

linux/drivers/sound/spitz_wm8750.c (WM8750向けのドライバソースコード)を読んでいて、おかしな箇所を見つけました。

WM8750のレジスタの初期設定値は、
unsigned short wm8750_def_table[WM8750_REG_NUM]
であり、この設定値は、サウンドデバイスの利用モード(再生/録音)に応じて wm8750_setup 関数内で再設定されます。そして、サウンドデバイスがopenもしくはresumeされるごとにWM8750にI2C経由で書き込まれます。

この設定値自体には問題ないのですが、実装を確認したところ一つ大きな問題を見つけました。

それは、レジスタへの書き込みを小さい番号からfor文でループさせていることで、この方法では、レジスタ全体への書き込みが終わる前に、R5レジスタのbit3(MUTE ON/OFF)がOFFに設定されてしまうことになります。
正しくは、レジスタ全体への書き込みが終わってからMUTEをOFFすべきです。

現状のコードでは、MUTE OFF後にR5以降のレジスタ値が書き換えられることで、その際に発生するノイズが出力されてしまうはずです。

・コードの修正方法

- R5レジスタへの書き込みをforループから外す

linux/include/asm-arm/arch-pxa/spitz_wm8750.h
において、
#define WM8750_REG_MASK1 8FFF3DAF
の記述を
#define WM8750_REG_MASK1 8FFF3D8F
に変更します(R5レジスタへの書き込みマスクを外す)。

- forループの後、明示的にMUTE OFFのコードを追加

linux/drivers/sound/spitz_wm8750.c
において、
wm8750_open関数およびwm8750_resume関数内で
for(i=0;i< WM8750_REG_NUM;i++) {
...
}
のループを抜けた後に、以下の関数呼び出しを追加

WM8750_set_DAC_MUTE(0);

これで本症状は解決できると思われます。
「思われます」と書いたのは、実際に試したわけではないためです。あくまでソースコード上で不具合らしき点を見つけ、その改善策を検討したという段階ですので、実際に試される方は、十分ご注意ください。

今回の件は、シャープのサポート窓口など経由で報告して、シャープ側で改善を図ってほしいと考えています。

もしも、どなたか適切な報告先をご存じの方がいらっしゃいましたら、教えてください。

(2005/06/27 追記)
本記事を参考に、実際にデバイスドライバのソースコードを変更して試してくださった方から、「この方法では改善されなかった」とのご報告をいただきました。残念ながら、別の対策が必要なようです。

linux/drivers/sound/spitz_wm8750.c は、サウンドチップ側の設定を行なうドライバですが、サウンドデータの送り出し側であるPXA270向けドライバ、pxa-i2s_spitz.c 側も読んでみました。

Linux側からサウンドデバイスをopenすると、pxa-i2s_spitz.c 内のaudio_open関数が呼ばれるのですが、その中で
- WM8750デバイスをopen
- PXA270のI2Sデバイスをopen
という順番でサウンドデータの流れを設定しています。
...ここもまずいのではないでしょうか?

あまり憶測を続けるとおしかりを受けそうなので、これ位にしておきますが、I2Sデバイスのopenが完了するまでは、WM8750のMUTEはONにしておかなければいけないように思います。もしくは、I2SデバイスをopenしてからWM8750デバイスをopenしてもよいように思えます。
まだまだ見落としがあるかもしれませんが、原因はなかなか根深そうです。

2005年 06月 21日 SL-C3000のサウンド機能解析 - 再生速度が速い/遅い理由 -

先日、「Walkmanの再生速度チェック」という記事において、Zaurus SL-C3000の再生が速かったと書きました。今回は、その原因を探ってみます。

今まで言及したことはありませんでしたが、私はSL-C3000の音質が結構気に入っており、手持ちのWalkmanと比較試聴して以下のように(個人的に)評価しています。しかしながら、Zaurusは汎用PCとして売られているせいか、そのサウンド機能にはいくつか疑問点があるので、これからその謎を解き明かしてみようと思っています。

(私の音質評価) CD Walkman(ソニー D-E01) > Zaurus(シャープ SL-C3000) > MD Walkman(ソニー MZ-NE810)

・解析材料
以下の文書を読んでみました。

「Intel PXA27x Processor Family Developer's Manual」- SL-C3000で採用されているCPU統合チップ、Intel PXA270の仕様書です。

「Wolfson Microelectronics WM8750 DATA SHEET」- SL-C3000で採用されているサウンドチップ、Wolfson Microelectronics WM8750の仕様書です。

チップの型番は、Impress PC Watch 「塩田紳二のPDAレポート■HDD内蔵PDA「シャープ SL-C3000」内部構造編■」から入手しました。

「SL-C3000(ROM Version : 1.01 JP)のLinuxカーネルのカーネルソースコード」- SL-C3000のLinuxカーネルのソースコードです。

・デバイスドライバのソースコードを読み解く

linux/drivers/sound/spitz_wm8750.c がWM8750向けのドライバです。
WM8750のレジスタの初期設定値は、
unsigned short wm8750_def_table[WM8750_REG_NUM]
であり、この設定値は、サウンドデバイスの利用モード(再生/録音)に応じて wm8750_setup 関数内で再設定されます。R7レジスタには00hが設定されることから、WM8750はI2S Slaveとして設定されることがわかります。つまりPXA270がI2S Masterになります。

linux/drivers/sound/poodle_i2sc.c がPXA270向けのI2Sドライバです。
I2S向けのクロックはPXA270が生成し、その値は i2s_open 関数内で設定されます。具体的には、PXA270のI2SコントローラレジスタSADIV(Audio Clock Divider)にサンプリング周波数に応じた分周率が設定されます

・再生速度の変化は、PXA270のI2S_SYNC(Sampling Frequency)の仕様が原因

PXA270のI2Sコントローラ仕様の表14.2にSADIV設定値とサンプリング周波数の対応表が載っています。以下抜粋します。

SADIV設定値, サンプリング周波数
0x0000_000C 47794Hz (48000Hz近傍)
0x0000_000D 44318Hz (44100Hz近傍)
0x0000_001A 21953Hz (22050Hz近傍)
0x0000_0024 16035Hz (16000Hz近傍)
0x0000_0034 10980Hz (11025Hz近傍)
0x0000_0048 8019Hz (8000Hz近傍)

ここから、PXA270のI2Sコントローラは、8k, 11.025k, 16k, 22.05k, 44.1k, 48kHzのサンプリング周波数に対応しており、それらは本来の値ぴったりには設定できないことがわかります。

これにより、「Walkmanの再生速度チェック」においてサンプリング周波数が44.1kHzの場合に再生速度が0.5%程度速くなることの説明がつきますし、48kHzであれば0.4%程度遅くなるはずです。

前回と同様、48kHzサイン波のMP3ファイル(1000秒)を作成し、再生時間を計ってみました。

・シャープ Zaurus SL-C3000 (のMusic Player)
再生時間: 1004秒 (-0.4%)

やはり予想通りでした。
今回の件は、PXA270のI2Sコントローラの制限による「SL-C3000の仕様」であると結論づけることができます。


以下、余談です。

PXA270のI2Sコントローラが対応していないサンプリング周波数の場合、ソフト的なサンプリング周波数変換は以下のドライバで行なわれるようです。
linux/drivers/sound/pxa-i2s_spitz.c
corgi_ct_s16 関数や、corgi_ct_u8 関数内で、12k, 24k, 32kHzから48kHzへの変換が行なわれます。しかし、内部のアルゴリズムは非常に原始的で(変換比率に合わせてデータコピーを行なうのみ)、デジタルフィルタも使われていないので非常にみにくい音になるはずです。(特に32kHz)

Zaurusでは、サンプリング周波数が12k, 24k, 32kHzのデータはなるべく使わない方が良さそうです。

2005年 06月 14日 1GB SDカード, SDカードリーダライタの購入

Transcend 1GB SDカード(80倍速) TS1GSD80ZOA秋葉原本店にて購入。8,998円。
Broadwatch SD専用カードリーダライタ USB-SDあきばおー5號店にて購入。799円。

Zaurus SL-C3000で、リムーバブルメディアの容量を向上させることにしました。これまで使っていたSDカードはPanasonicの128MB品で、ちょっとした新聞記事(NewsClip)や読み物に加え、音楽やビデオを詰め込むとあっと言う間に容量が一杯になっていたので、今後は1GB品を使うことでこの問題は解消されると思います。

80倍速というのはCDの倍速値を指標としているので、数値に直すと10MByte/Sec 以上ということだそうです。製品には、Max. Read:12MB/s, Write:10.65MB/sと表記されていました。正直、Zaurusの転送速度性能と比較するとオーバースペックなのですが、SDカードのデジカメなどへの転用も考慮して高速品にしました。

Transcendは、速度、信頼性の両面で特にデジカメ向けで一定の評価を得ていることを知っていたので、もっと安価(7,000円を切り始めたもよう)ないわゆるノーブランド品は避けてこちらを購入しました。
ZOAでは「メモリチェックサービス」があるので、"購入することを前提で"ZaurusにTranscend 1GB品を挿して、簡単な動作チェックをした後で購入しました。

カードリーダライタは、職場のPCなどSDメモリーカードが読めない環境向けに購入しました。
それを買わなくても、ZaurusをUSBケーブルでPCに認識させればよいという話もありますが、その方法はなにかと手間なのです。
いずれにせよ、ここ最近のセキュリティ強化の一環で、職場でのUSBメモリ使用が禁止されたらアウトですが...

現在、Zaurusの内蔵HDDには自分の中で定番の音楽(Debussyのピアノ曲などのクラシック音楽や80'sポップスその他を1GBほど)を詰め込んでいるのですが、今後は、SDカードにその日の気分に応じた曲やラジオ番組を詰め込むといった使い方ができるのではないか、と期待しています。

2005年 06月 03日 Walkmanの再生速度チェック

「ソニーのNetwork Walkmanは再生が速い(らしい)」という話題が、スタパ齋藤の週刊スタパトロニクスmobileでも取り上げられていたので、私の手持ちの機材ではどうなんだろうと気になって実験してみることにしました。

(注: 私は、話題のNetwork Walkmanは所有しておりません。測りたい方はご自分の機材でお試しください)

ちなみに、昔カセットテープ全盛だった頃は、デッキによって再生速度が異なるのは半ば常識的だったと思うのですが、CD以降、デジタル機器があふれる現在は数秒の誤差も許されなくなってきた、あるいは気にする人が増えた、ということなのでしょうか。

昔ばなしをもう一つすると、民生向けデジタル録音の黎明期、家庭用ビデオの映像トラックを利用したデジタルオーディオプロセッサのサンプリング周波数は、NTSC規格に合わせて44056Hzでしたが、その後44100Hzで統一されることになって、再生速度が変化してしまうことが話題になったと記憶しています。こちらは微妙な差だったので、それでOKということになり、その後のCD規格のサンプリング周波数にも44100Hzが採用された、だったかな(私が中高生の頃に雑誌で読んだ話なのでうろ覚え)。

閑話休題。
週刊スタパトロニクスでは、複数機器を並べて再生速度を比較していましたが、相対比較ではどの機材が正しい速度なのかを断言することはできません。よって今回は絶対比較のため、絶対的に正しい長さの曲を作り、それを聴くことにします。
ツールとしては前回の記事と同様、efuさんのWaveGeneを用います。このソフトで、1000秒のサイン波のWAVEファイルを作成し、MP3やATRACに変換します。それをWalkman等で再生し、時間を計れば再生速度が求まります。

以下、手持ちの機材での測定結果です。

・ソニー Net MD Walkman MZ-NE810
再生時間: 1000秒 (±0%)

・シャープ Zaurus SL-C3000 (のMusic Player)
再生時間: 995秒 (+0.5%)

ストップウォッチなどで厳密に計ったわけではないのですが、手持ちのMD Walkmanは問題ないと言えそうです。
Zaurusは速かったです。ちょっとがっかりですが、音楽専用機ではないのでしょうがないかもしれません。

 | HOME | 

Calendar

« | 2005-06 | »
S M T W T F S
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

Recent Entries

Categories

Recent Comments

Recent Trackbacks

Monthly

Appendix

surf2koike

surf2koike

いろいろ試してみたことをぼそぼそと。

FC2Ad

まとめ