丸井綜研 このページをアンテナに追加 RSSフィード

2010-02-23

[][]ラウドネスの近似値計算

コンピュータの中にあるWAVファイルどうしの音量比較をしたいときはけっこうあります。音量の指標として「ラウドネス(sone)」があり、以前その計算プログラムも書いたのですが、その音を鳴らしたときの音圧値(dBSPL値)が分からないと正確な値が得られないというものでした。そのため、実際にスピーカーで鳴らして、レベルメーターで計測して、という手間がかかります。複数のWAVファイルの音量をある程度そろえたいときに、いちいち実験室をセッティングするのはめんどうです。どうせWAVファイルはすべてコンピュータ内にあるので、コンピュータ内で完結させられればいいなぁ、なんて思ってました。

そんなときに見つけたのがITU-R BS.1770-1勧告。複数ファイルの相対的な音量を計算するための方法が書かれた国際基準です。単位はLKFSで、0 dBFS、1 kHzのサイン波が約-3.01 LKFSとなります。規格書を読んでみたらそれほど難しくなかったので、規格書通り*1にちゃちゃっとMatlabプログラムを書いてみました。ハードウェアやプラグイン・ソフトとしても実装されているんですが、単純なわりに買うと意外に高いので、

function lkfs = loudness(X, fs)
%LOUDNESS   Loudness in LKFS based on Rec. ITU-R BS.1770-1
%   lkfs=loudness(X,fs) computes loudness level in Rec. ITU-R BS.1770-1.
%
%   X - input signal
%   fs - sampling frequency of the signal X
%
%   Input signal can be 1 to 5 channels from mono, stereo, to 5.0ch
%   surround sound.  Exclude LFE channel when using 5.1ch source.
%
%   2010-02-23 by MARUI Atsushi

%% check matrix size
if size(X,1) < size(X,2)
  X = X';
end
if size(X,2)>5
  error('Number of channels must be less than or equal to five.');
end
numCh = size(X,2);
X = resample(X, 48000, fs);

%% pre-filter
b0 = 1.53512485958697;
b1 = -2.69169618940638;
b2 = 1.19839281085285;
a1 = -1.69065929318241;
a2 = 0.73248077421585;
A = [ 1 a1 a2];
B = [b0 b1 b2];
Y1 = zeros(size(X));
for n=1:numCh
  Y1(:,n) = filter(B, A, X(:,n));
end

%% RLB weighting curve
%[B,A] = butter(2, 50/(48000/2));
b0 = 1.0;
a1 = -1.99004745483398;
b1 = -2.0;
a2 = 0.99007225036621;
b2 = 1.0;
A = [ 1 a1 a2];
B = [b0 b1 b2];
Y = zeros(size(Y1));
for n=1:numCh
  Y(:,n) = filter(B, A, Y1(:,n));
end

%% mean square
z = sum(Y .^ 2) / length(Y);
G = [1 1 1 sqrt(2) sqrt(2)];
for n=1:numCh
  u(n) = G(n) * z(n);
end
lkfs = -0.691 + 10 * log10(sum(u));

これはこれで便利ですが、ふたつのWAVファイルを同じLKFS値にするためにはもうひと工夫が必要です。ある音信号X(サンプリング周波数fs)を、指定したLKFS値にするためには何倍しなくてはならないかを計算してるものです。factor=loudness_match(x, 44100, -20);などとすれば、factor*xが-20LKFSとなるようなfactorを追い込んでくれます。

function factor = loudness_match (X, fs, lkfs)
%LOUDNESS_MATCH
%   LOUDNESS_MATCH (X, fs, lkfs) calculates a amplitude multiplication factor
%   which equalizes a sound to match the specified loudness (in LKFS).
%
%   See also LOUDNESS by the same author
%
%   2010-02-23 by MARUI Atsushi

factor = 1.0;
factorHigh = 10.0;
factorLow = 0.0;
i = 1;

while i
  s = loudness(factor * X, fs);
  k = (s - lkfs) / lkfs;
  
  disp(sprintf('%3d:   Factor %7.5f   LKFS %7.3f   (%6.2f%% difference)', i, factor, s, k*100));
  i = i + 1;
  
  if abs(k) < 0.0005
    return;
  end
  
  if k < 0.0
    factorOld = factor;
    factor = (factorLow + factor) / 2.0;
    factorHigh = factorOld;
  elseif k > 0.0
    factorOld = factor;
    factor = (factorHigh + factor) / 2.0;
    factorLow = factorOld;
  end
end

*1:規格書はfs=48000 Hzのときのフィルタ係数しか書いていなかったので、めんどくさくなってプログラム中で入力信号を全て48000 Hzにリサンプリングしています。本当は信号のサンプリング周波数にあったフィルタ係数を計算するほうがいいのでしょう。ここは改良の余地有りです。RLB重み曲線についてはコメント中にフィルタ係数計算の形跡を残しておきました。

2010-02-10

Macが主流になって

幸か不幸か自分の身の回りにMacが主流になって、なんとなくつまらない気分になってきました。マイノリティに喜びを感じるMなのかもしれません。Linuxにするかなぁ。

2010-01-30

[]関数の定義

まずマニュアルを読まずにCommon LispやSchemeのようにdefunやdefineを試してみましたが、ダメ。しょうがないのでマニュアルを読むと、defnだとか。

(defn times2 [x]
  (* x 2))

ひっかかりそうなのが引数指定の部分。引数はvectorとして与えてやる必要があります。

2010-01-29

[]iPadはコンピュータではないが、コンピューティングを変える

とうとうiPadが発表されたので、iPhone3GSととKindle2を持っている僕がひとこと言ってみるテスト。

コンピュータがコンピュータ足るための条件の一つとして、僕は「自分で自由にプログラムを作り利用できること」があると考えています。iPhone/iPod touch/iPad用のプログラムに関しては、開発ソフトが無料で配布されていることもあり、自由に作ることができます。ところが利用する点になると、そのままではシミュレータ上でしか実行できず、Appleに年会費(約1万円)を支払わないと実機で使うことができません。また、自作ソフトを他の人に渡そうというときにも問題が立ちはだかります。アプリの配布はApp Store経由でのみ行われるので、Appleに認可されないと配布ができないのです。そのため、自由なプログラムの利用ができないのです。そのため、iPadは薄型コンピュータであるというよりも情報端末と言ったほうがピンと来ます。

常にネット接続されていて、限られたアプリケーションしか使えない点において、無線のシンクライアントというイメージです。Googleが「ほぼウェブブラウザ」のChrome OSを発表し、AppleはiPadを発表し、ようやく一般人が使えるシンクライアントが登場したと言えます。僕らがむかし夢に見た*1、どこでもコンピュータの世界がすぐそこに来ています。ガラパゴス日本で進化した携帯電話はかなり高機能ですが、それだけではマジな仕事には使えません。でも、iPadにiWork 2010を入れたら、十分仕事に使えるでしょう。

結局のところ、ハードウェアとして見たらiPadは基本的には大きなiPod touchにすぎません。画面が大きくて操作性が良くなってiWorkも動きますが、iBookStoreが熟成してコンテンツ量がAmazonと拮抗するくらいになるまではKindle2+iPhone > iPadだと思いますし、コンピュータとして考えると各種ネットブック > iPadでしょう。しかし、iPadをとりまくMac本体、App Store、iBookStore、iWork、料金プランなどの有機的なつながりによって、iPhoneアプリが普及して携帯電話にまつわるライフスタイルが変化したように、僕はiPadが普及することによってコンピューティングの在り方そのものが変わると考えています。

(個人的には、常に持ち歩いているMacBookPro+iPhone+Kindle2でiPad的なことは実現できているので、初期モデルは見送りますが。)

*1:映画『ブレードランナー』にも主人公が街角の公衆情報端末を操作しているシーンが出てきますね。

2010-01-19

Ubuntu Studio

空いてるマシンにUbuntu Studio 9.10を入れてみました。なかなか良いです。Ubuntuの自動ハードウェア認識による導入のしやすさに加え、音楽・音響系のソフトがかなりそろっていて、すぐにハードディスク・レコーディングが始められます。動作も軽いし、これだったらネットブックでもなんとかなりそう。ほんと、Macじゃなくても、という気になってしまいます。

導入するとなったらVAIO Type PLOOX Uなどの小型マシンに導入して持ち歩きたいです。個人的に英語キーボード必須なので、海外モデルの逆輸入とか考えないと。

2010-01-18

[]NSLogメモ

CocoaのFoundationフレームワークで使うNSLog()のメモ。

printfとほとんど同じ使い方。

NSLog(@"hogehoge %d %f %@", intNum, floatNum, anObject);

行頭に日付時刻とプロセス名が、行末に\nが、自動的に付加されます。%〜の意味は以下の表の通り。(Hillegass本第3版より)

記号表示する型
%@id
%d, %D, %ilong
%u, %Uunsigned long
%hishort
%huunsigned short
%qilong long
%quunsigned long long
%x, %Xunsigned long (16進数で表示)
%o, %Ounsigned long (8進数で表示)
%f, %e, %E, %g, %Gdouble
%cunsigned char (ASCII文字)
%Cunsigned char (Unicode文字)
%schar * (終端NULLのASCII文字によるC文字列)
%Sunichar * (終端NULLのUnicode文字によるC文字列)
%pvoid * (先頭0xの16進数で表示されるアドレス)
%%%そのもの

NSLogの引数として渡している文字列は@"〜"の形式になっていますが、これはNSString型の文字列であることを表しています。単に"〜"だとC文字列 (すなわちchar *型)。C文字列からNSString文字列への相互変換は以下の通り。

const char *cstr = "hoge";
NSString *nsstr;
nsstr = [NSString stringWithUTF8String:cstr];
cstr = [nsstr UTF8String];

2010-01-17

荒川から東京スカイツリー

f:id:amarui:20100116140041j:image:right:medium

JR北千住駅から千代田線町屋駅まで荒川沿いを歩き、都電荒川線でガタゴトと早稲田まで。荒川の堤防から浅草の方向を見ると、建設中の東京スカイツリーの姿が見えます。現在264m。完成すると634mなので、ここらへんではめっぽう高い建物になりますね。どこに行くにしても、「あっちが浅草(というか押上)」という目印となってくれそうです。

2010-01-13

ジェネリック医薬品・・・なわけないよねー

f:id:amarui:20100113152027j:image:medium:right

いつだったかの新聞の折り込みチラシにこんな商品が掲載されていましたマキオールとバッサニンエース。シュパッと殺菌できるコレや、半分は優しさで出来ているアレのジェネリック医薬品版かとも思いましたが、どうもそうではないような気もします。ここまで似ていて大丈夫なんでしょうか? Abibas、Louis Vuittom、Channel、Aqqle、Gooqleなどとも似た、とても危険な香りがします。

2010-01-11

建設中の東京スカイツリー見てきた

f:id:amarui:20100110153740j:image:right:medium

墨田区押上に建設中の電波塔東京スカイツリーを見てきました。昨日時点で254mまで完成しているとのこと。完成すると634mになるので、現時点ではまだ半分以下。周囲に高い建物があまりないので、スカイツリーは現時点でもかなり目立つ建物です。これが600mを越えたら、と思うとワクワクします。

スカイツリーを見たあとは浅草界隈をぶらぶらしました。神谷バーはいつも満席で座れず、まだデンキブラン飲んだことないです。そのまま帰りました。

2010-01-10

ベテルギウスの超新星爆発

今日の朝日新聞一面に、オリオン座のベテルギウスに超新星爆発の予兆があるという記事が載っていました。「爆発は数万年後かもしれないが、明日でもおかしくない」とする専門家の言葉が紹介されていました。

ただ、ベテルギウスまでは約600光年の距離があります。光の速度で移動しても600年かかるという遠い場所です。つまり現在、地球上で観測しているベテルギウス表面の様子というのは600年前のもので、それより最近の様子を知ることはできません。地球の観測者にとって「明日爆発してもおかしくない」という時間は、ベテルギウスにとっては「600年前に爆発していてもおかしくない」時間です。もしかしたら600年前の室町時代にはベテルギウスは超新星爆発を起こし、すでに恒星はなくなっているのかもしれず、我々が観測しているのはベテルギウスが死の直前に放った最後っ屁なのかもしれないのです。