デジタルVU、Peakメーター

デジタルVU、Peakメーター大体完成しました。
DSC_0844.jpg
VU値は「RMS」である。と、書いてあったので、さくっと作ってみました。
割といい感じです。ヘッドホンにデジタルノイズも全く無しです。電源を「MAU106」で絶縁し、A/Dをフォトカプラで絶縁しているので、オーディオ回路は完全にフローティング状態です。
10バー LED は秋月で@200-です。結構お高い。輝度は結構高かったので、電流制限抵抗を高く出来てコモン側の FET も必要なかったかもしれません。
この回路の珍しいところは、フォトカプラで絶縁しているところでしょうか。CTRでさちらせてA/Dに入れていますので、オペアンプで LR の比率や A/Dがさちるところまで調整できるように、可変抵抗とボリュームが付いています。
理想ダイオードオペアンプ3段重ねです。全波整流と半波整流は見た目ほとんど変わらないので、面倒なら半波でいいと思います。少しだけなめらかです。半波の0の2乗平均√なので、計算的にも問題ありません。
このPICの A/D変換は「10ビットA/Dコンバータの使い方」で完全に説明されているので、余裕でした。
TMR3をトリガーにして40kHz。割り込みがまわし切れていないときもあるかもしれませんが、足してその回数で割るだけなので、どうでもいいのです。最後の計算はmainでしていて、バーが動くということは回って入るということです。
RMSとPeakなので、プログラムはこんな感じ。A/D の割り込みで、最大値と、2乗したものを保存。10bit同士の掛け算は桁があふれるので、8bitにしてshortに入れます。
結局速度的には変わらなそうなのでlongにしたのですが、ビットシフトしています。これは最終的な分解能が4bit(10諧調)なので、そのままです。プログラムをいじってshortにしたときにバグるとか、16*16が32bitだとかそんな安易な理由でそのままです。


inline void InterruptAD(void)
{
unsigned long l,r;
l = ReadADC10(1) >> 2;
r = ReadADC10(0) >> 2;
#if 0
m_L.add_buff += l;
m_R.add_buff += r;
#else
if(m_L.add_buff < l) { m_L.add_buff = l; }
if(m_R.add_buff < r) { m_R.add_buff = r; }
#endif
m_L.pow_buff += l * l;
m_R.pow_buff += r * r;
m_L.ad_num++;
//    m_R.ad_num++;
}


a = m_L.peak / ADC_BIT * 11.0 * 1 + 0.5; m_L.bar_peak = lib_limit(a, 0, 10); a = m_R.peak / ADC_BIT * 11.0 * 1 + 0.5; m_R.bar_peak = lib_limit(a, 0, 10); a = m_L.vu / ADC_BIT * 11.0 * 1 + 0.5; m_L.bar_vu = lib_limit(a, 0, 10);

みたいな感じで、バーLEDに。簡単です。PeakとVUは 単位が違うので 純粋な積分じゃないので(多分)、適当に倍率かけて表示です。
じーっと、みていると、iTunesで取った音楽と、他でのMP3はPeakがそろっていないので、そこで頭打ちするんですね。エンコーダーのパラメータによってPeakの上限が変わります。耳で聞いていても違いは分からないのですが、へ~、ずーっと見ていても飽きないです。
VUの計算ですが、「インピーダンス600Ωの負荷回路へ1kHzの正弦波を加えて1mWの電力を消費したときの出力電圧を0dBmとし、+4dBmを0VUとする。」らしいのですが、作ったものは基準を示す測定器ではないので、PC のラインアウトから出た信号をボリュームで適当に回して終わりです。
0.777Vが0dbだったかな。とか、いろいろらしい。300msecの積分だとか。これは全然メーターが動かなかったので却下しましたが、動画で動かしてみると、音声の振幅が大きいので、音楽には向かない積分時間なのかもしれません。
あと、針のオーバーシュート量まで決まっているらしいので、針のVUメータはもっと楽しげに動くのかもしれません。
比べようがないのと、オシロスコープを持っていないので、なんともかんとも。
アナログテレビの時は、NHK と民放がこの基準が違って、音量が違うんですよね。あと、CMでも違ったとかだったような。
結局のところ、見た目かっこよければいいだけなので、平均値と実効値の表示ができればいいのです。
VUメーター
音圧レベル
といったような感じで音圧表示です。VUにも派生型がいっぱいあるみたいなので、どの計算が正解とか微妙みたいです。
とりあえず、10bitADCで2乗して適当な時間(私は20msec。応答速度と表示がいい感じ)足し算しまくって、割り込みの外で除算して、√取ります。簡単です。
VU metor
Audio amp
つかね。バーが箱の正面に取付できないのですよ。小さく作り直すか、ボリュームなどを移動させるか、上に向けるか。困った。

Audio

Posted by saba