2

ウィキペディアによると、バーク スケールは次の式で概算できます。

b(f) = 13*atan(0.00076*f)+3.5*atan(power(f/7500,2))

周波数スペクトルを Bark スケールで同じ長さの間隔に分割するにはどうすればよいですかn(間隔分割ポイントは Bark スケールで等距離になります)。

最良の方法は、関数を分析的に逆にすることです(xの関数で表現しますy)。紙でやろうとしたけどダメだった WolframAlpha 検索バーでもできませんでした。Octavefinverse関数を試してみましたが、エラーが発生しました。

Octave は次のように述べています (より単純な例として):

octave:2> x = sym('x');
octave:3> finverse(2*x)
error: `finverse' undefined near line 3 column 1

これはfinverseMatlab からの説明です: http://www.mathworks.com/help/symbolic/finverse.html

それを行う数値的な方法もあるかもしれません。y軸を均等に分割するところから始めて、二分探索で理想的な分割を探すだけだと想像できます。しかし、それを行う既存のツールがいくつかあるのではないでしょうか?

4

4 に答える 4

1

この方程式を数値的に解く必要があります (解析的な逆関数はありません)。b等間隔の値を設定し、方程式を解いてさまざまな を見つけますf。二分法はやや遅いですが、非常に優れた代替手段はブレントの方法です。http://en.wikipedia.org/wiki/Brent%27s_methodを参照

于 2012-10-09T20:00:41.957 に答える
1

ご存知のように、rpsmiまたはDavid Zaslavskyの回答を(たとえば)オクターブで実装するには、次のようにします。

global x0 = 0.

function res = b(f)
   global x0
   res = 13*atan(0.00076*f)+3.5*atan(power(f/7500,2)) - x0
end

function [intervals, barks] = barkintervals(left, right, n)
    global x0
    intervals = linspace(left, right, n);
    barks     = intervals;
    for i = 1:n
        x0 = intervals(i);
         # 125*x0 is just a crude guess starting point given the values
        [barks(i), fval, info] = fsolve('b', 125*x0);
    endfor
end

次のように実行します。

octave:1> barks
octave:2> [i,bx] = barkintervals(0, 10, 10)
[... lots of output from fsolve deleted...]
i =

 Columns 1 through 8:

    0.00000    1.11111    2.22222    3.33333    4.44444    5.55556    6.66667    7.77778

 Columns 9 and 10:

    8.88889   10.00000

bx =

 Columns 1 through 6:

   0.0000e+00   1.1266e+02   2.2681e+02   3.4418e+02   4.6668e+02   5.9653e+02

 Columns 7 through 10:

   7.3639e+02   8.8960e+02   1.0605e+03   1.2549e+03
于 2012-10-10T12:11:28.033 に答える
1

最終的に、Bark 値の近似値を使用せず、臨界帯域の中心 ( で定義n=1..24) の理想値を使用することにしました。でそれらをプロットしgnuplot、同じグラフに、より密度の高い点に対して任意に選択した値をプロットしました(必要なn>24)。Hz両方の曲線がほぼ同じになるまで、ポイント値を調整しました。

もちろん、 rpsmiDavid Zaslavsky の回答は、より一般的でスケーラブルです。

于 2012-10-10T08:40:12.380 に答える
1

この関数は分析的に反転できません。いくつかの数値手順を使用する必要があります。二分探索でも問題ありませんが、このようなことを行うためのより効率的な方法があります。ルート検索アルゴリズムを調べてください。選択したアルゴリズムを、b(f) = f_n各周波数間隔エンドポイントの式に適用できますf_n

于 2012-10-09T19:54:25.820 に答える