サンプルから波形のPDFを計算する


27

しばらく前に、デジタル波形を描画するさまざまな方法を試していましたが、私が試みたのは、振幅エンベロープの標準シルエットではなく、オシロスコープのように表示することでした。これは、正弦波と方形波がスコープ上でどのように見えるかです。

ここに画像の説明を入力してください

これを行う単純な方法は次のとおりです。

  1. 出力画像のオーディオファイルを水平ピクセルごとに1つのチャンクに分割します
  2. 各チャンクのサンプル振幅のヒストグラムを計算します
  3. ピクセルの列として輝度でヒストグラムをプロットします

次のようなものが生成されます。 ここに画像の説明を入力してください

これは、チャンクごとに多くのサンプルがあり、信号の周波数がサンプリング周波数と無関係である場合は正常に機能しますが、そうでない場合は機能しません。たとえば、信号周波数がサンプリング周波数の正確な約数である場合、サンプルは各サイクルで正確に同じ振幅で常に発生し、実際の再構成信号がこれらのポイント間に存在しても、ヒストグラムはほんの数ポイントになります。このサインパルスは上記の左と同じくらい滑らかでなければなりませんが、正確に1 kHzであり、サンプルは常に同じポイントの周辺で発生するため、そうではありません。

ここに画像の説明を入力してください

ポイント数を増やすためにアップサンプリングを試みましたが、問題は解決せず、場合によっては問題を解決するのに役立ちます。

だから、私が本当に欲しいのは、デジタルサンプルから連続的に再構築された信号の真のPDF(確率vs振幅)(振幅vs時間)を計算する方法です。これに使用するアルゴリズムがわかりません。一般に、関数のPDFはその逆関数の関数です。

sin(x)のPDF:ddxarcsinx=11x2

しかし、逆関数が多値関数である波に対してこれを計算する方法や、それを高速に行う方法はわかりません。それをブランチに分割し、それぞれの逆数を計算し、導関数を取り、それらをすべて合計しますか?しかし、それはかなり複雑で、おそらくもっと簡単な方法があります。

この「補間データのPDF」は、GPSトラックのカーネル密度推定を行う試みにも適用できます。リング状にすべきでしたが、サンプルだけを見て、サンプル間の補間点を考慮していなかったため、KDEはリングというよりもハンプのように見えました。サンプルがわかっているだけであれば、これが最善です。しかし、サンプルは私たちが知っているすべてではありません。また、サンプル間にパスがあることもわかっています。GPSの場合、帯域制限されたオーディオのように完璧なナイキスト再構成はありませんが、補間関数に推測を加えることで基本的な考え方が適用されます。


興味のある多値関数の例はありますか?おそらく、物理データにとって最も意味のある分岐カットに沿って評価する必要があります。
ロレムイプサム

その種のプロットを描く方法にもっと興味がありますか、それともプロットはPDFの計算に関する質問の単なる動機ですか?
データガイスト

@yoda:さて、正弦波の上記の関数は、各半サイクルが次と同じPDFを持っているため、半サイクルだけを取り、反転して微分を取ることによって見つけられます。しかし、任意のオーディオ信号全体の値を取得するために、その仮定を立てることはできません。あなたはそれを「ブランチカット」に分割し、それぞれのPDFを順番に取り、それらをすべてまとめる必要があると思いますか?
エンドリス

@datageist:うーん。私はそのようなプロットを描く方法に興味がありますが、そのようなプロット PDFです。同じまたは非常に類似した結果を生成するショートカットは大丈夫です。
エンドリス

@endolith、そうそう、わかりました。強調についての質問です(つまり、どの種類のショートカットが妥当か)。
データガイスト

回答:


7

元のレートの数倍に補間します(たとえば、8倍のオーバーサンプリング)。これにより、区分的線形信号を仮定できます。この信号は、無限分解能である連続的な波形のsin(x)/ x補間と比較して、誤差がほとんどありません。

オーバーサンプリングされた値の各ペアには、ある値から次の値への連続線があると仮定します。間のすべての値を使用します。これにより、任意の解像度のPDFに蓄積されるy1からy2までの1つの薄い水平スライスが得られます。確率の各長方形スライスは、1 / nsamples領域にスケーリングする必要があります。

サンプリング周期と波形の間に基本的な関係がある場合でも、サンプル自体ではなくサンプル間の線を使用すると、「スパイキー」PDFが防止されます。


線形補間ヒストグラムの関数を作成しましたが、危険です。このための既存のコードを知っていますか?
エンドリス

線形補間は、オーバーサンプリングなしでも、ほとんどの波形に大きな違いをもたらします。現在、1 kHzの正弦波はほとんど997 Hzの正弦波に似ています。サンプル値での水平線の代わりに、それらの間の色の水平バンドになりました。オーバーサンプリングでは、バンドも平滑化されます。FFTリサンプリングと隣接チャンクとのオーバーラップにより、実際のサンプル間ピークにヒットさせることができるはずです。ただし、補間されたヒストグラムコードを高速化する必要があります
...-Endolith

私は完全にこれのために私のスクリプトを書き直し、と私はヒストグラムと右のこの時間はアンチエイリアスだと思う:gist.github.com/endolith/652d3ba1a68b629ed328
endolithを

最新バージョンは、あるgithub.com/endolith/scopeplot
endolith

7

基本的には、Jason Rの「ランダムリサンプラー」です。これは、ヨーダの確率的サンプリングのプリサンプリング信号ベースの実装です。

2つのサンプル間のランダムな1つのポイントに単純な3次補間を使用しました。原始的なシンセサウンド(飽和して帯域制限されていない正方形のような信号+高調波から正弦波への減衰)の場合、次のようになります。

ランダムリサンプリングシンセPDF

それをより高いサンプルバージョンと比較してみましょう。

ここに画像の説明を入力してください

そして、サンプルレートが同じで補間のない奇妙なものです。

ここに画像の説明を入力してください

この方法の注目すべきアーティファクトは、正方形のような領域でのオーバーシュートですが、これは実際にsincフィルター処理された信号のPDF(私が言ったように、信号が帯域制限されていない)のように見え、知覚されるラウドネスをより良く表しますこれがオーディオ信号の場合、ピークよりも

コード(Haskell):

cubInterpolate vll vl v vr vrr vrrr x
    = v*lSpline x + vr*rSpline x
      + ((vr-vl) - (vrr-vll)/4)*ldSpline x
      + ((vrr-v) - (vrrr-vl)/4)*rdSpline x
     where lSpline x = rSpline (1-x)
           rSpline x = x*x * (3-2*x)
           ldSpline x = x * (1 + x*(x-2))
           rdSpline x = -ldSpline (1-x)

                   --  rand list   IN samples  OUT samples
stochasticAntiAlias :: [Double] -> [Double] -> [Double]
stochasticAntiAlias rs (lsll:lsl:lsc:lsr:lsrr:[]) = []
stochasticAntiAlias (r:rLst) (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)
    = ( cubInterpolate lsll lsl lsc lsr lsrr lsrrr r )
          : stochasticAntiAlias rLst (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)

rand list 範囲[0,1]の確率変数のリストです。


1
かっこいい。Haskellコードの場合は+1。
データガイスト

はい、サンプル値オーバーシュートするはずです。実際には、各ピクセル列のピーク値も、最大サンプルだけでなく、最大サンプル間ピークに基づいて異なる方法で描画することを計画していました。flic.kr/p/7QAScXのような波形は、これが必要な理由を示しています。
endolith

「高サンプリングバージョン」とは、アップサンプリングされているが、均一にサンプリングされているという意味ですか?そして、それは青い点ですか?
エンドリス

1
@endolithそもそも、より高いサンプルレートで計算された元の波形です。基本的に、青い点は192 kHzでサンプリングされたサウンドを表し、一番下の黄色の点は24 kHzへのナイーブなダウンサンプルを表します。上の黄色のポイントはstochasticAntiAliasこれです。しかし、どちらの場合でも、より高いサンプルバージョンは実際に均一なレートです。
左辺約

5

あなたのアプローチは理論的には正しいですが(非単調関数については少し修正する必要があります)、一般的な関数の逆関数を計算することは非常に困難です。あなたが言うように、あなたは分岐点と分岐カットに対処する必要がありますが、それは実行可能ですが、真剣にしたくないでしょう。

既に述べたように、定期的なサンプリングでは同じポイントセットがサンプリングされるため、サンプリングされない領域では(ナイキスト基準が満たされていても)推定値が低くなりやすくなります。この場合、より長い期間のサンプリングも役に立ちません。

一般に、確率密度関数とヒストグラムを扱うときは、通常のサンプリングよりも確率的サンプリングの観点から考える方がはるかに良い考えです(紹介については、リンクされた回答を参照してください)。確率的にサンプリングすることにより、すべてのポイントが「ヒット」する確率が等しくなり、pdfを推定するはるかに優れた方法になることを保証できます。

次に例を示します。関数考えます。これをサンプリング周波数 Hz(ナイキスト周波数、 Hz)でサンプリングすると、結果の確率密度は左側のプロット(-2と2の間の401の等間隔ビン)になります。10秒間サンプリングしても100秒間サンプリングしても問題ありません。それでも同じままです。一方、1秒あたりサンプル(均一な分布)の速度で確率的にサンプリングすると(ここではHzを使用しません。異なる意味を意味するため)、右側のプロット(同じビニング)が得られます。f(x)=sin(20πx)+sin(100πx)fs=1000fN=1001000

ノイズはありますが、実際のP​​DFへの近似値は、いくつかの間隔でゼロを示し、他のいくつかで大きなエラーを示す右側のものよりもはるかに優れていることが簡単にわかります。観測時間を長くすることで、右側の分散を小さくすることができ、最終的には大きな観測の制限内で正確なPDF(黒い破線)に収束します。

ここに画像の説明を入力してください


1
「汎用関数の逆関数を計算するのは非常に難しい」さて、これは一連のサンプルほど関数ではないので、逆関数を見つけることは、サンプルのx座標とy座標を入れ替えてから、適合するようにリサンプリングするだけです。新しい座標系。とにかくサンプリングを変更することはできません。均一サンプリングを使用して作成された既存のデータについて話している。
エンドリス

4

カーネル密度推定

波形のPDFを推定する1つの方法は、カーネル密度推定器を使用することです。

x(n)K(x)δ(xx(n))P^

P^(x)=n=0NK(xx(n))

更新:興味深い追加情報。

あなたは信号があるとしするために、その後、---あなたが言うように---あなたはまた、そのDFT知ることができる:x(n)n=0,1,...,N1X(k)

X(k)=n=0N1x(n)eȷ2πnk/N

その結果、係数であり、:X(k)eȷ2πnk/N

x(n)=1Nk=0N1X(k)eȷ2πnk/N

だから、推測あなたがaftermight各フーリエ成分を一緒に、すべてのPDFを畳み込むすることしているもので:

|X(k)|11x2

ただし、位相が加算に寄与する(または寄与しない)方法は考慮されません。x n X(k)x(n)

しかし、もっと考えが必要です!


私はそれを考えましたが、密度推定は未知の確率密度関数の推定に使用されます。ナイキストのサンプリング定理により、波形全体が正確に既知であり、正確な確率密度関数も既知である必要があります。速度と精度のトレードオフであれば見積もりには問題ありませんが、実際のP​​DFを取得する方法が必要です。同様に、再構成された波形は、各サンプルにsinc関数を配置し、それらを合計することにより作成できます。sinc関数のPDFをカーネルとして使用してPDFを作成できますか?私はそれがそのように働くとは思わない。
エンドリス

同様に、これは信号サンプルがサンプリング周波数の約数である問題を解決するとは思わない。サンプル間の再構成された波形を考慮していませんか?PDFの各ポイントをぼかすだけで、隙間を埋めようとします。サンプル間の値を考慮していないため、GPSトレースのカーネル密度推定を実行しようとすると、同様の問題が発生しました。
エンドリス

4

コメントの1つで示したように、サンプルと帯域制限された信号を補間するsinc関数のPDFのみを使用して、再構築された信号のヒストグラムを計算できると魅力的です。残念ながら、sincのヒストグラムには信号自体が持っている情報のすべてが含まれていないため、これは不可能だと思います。各値が出現する時間領域の位置に関するすべての情報が失われます。これにより、sincのスケーリングされたバージョンと時間遅延されたバージョンがどのように合計するかをモデル化することができなくなります。これは、実際に実行せずに信号の「連続」またはアップサンプリング。

最適なオプションとして補間が残っていると思います。あなたは、あなたがこれをすることを望んでいないいくつかの問題を示しましたが、私は対処できると思います:

  • 計算費用:もちろん、これは使用する特定のアプリケーションに応じて、常に相対的な懸念事項です。収集したレンダリングのギャラリーに投稿したリンクに基づいて、オーディオ信号の視覚化のためにこれを実行したいと考えています。リアルタイムアプリケーションまたはオフラインアプリケーションのどちらに興味がある場合でも、効率的な補間器のプロトタイプを作成して、本当に高すぎるかどうかを確認することをお勧めします。多相リサンプリングは、これを柔軟に行うための優れた方法です(任意の合理的な要因を使用できます)。

  • サンプリング周波数に合理的に関連する周期的コンポーネントへのバイアス:これを完全に除去することはできませんが、「奇妙な」要因で補間することでいくらか軽減できるはずです:4でアップサンプリングする代わりに、71/18を試してください(単なる例)。これはやや複雑な構造になりますが、効率的に実装できます。これにより、サンプルレートに関連する周波数を持つコンポーネントの期間全体にわたって、サンプルのより均一な分布が得られます。または、リサンプリングスキームを使用して、任意のリサンプリング比を選択し、ような(ほぼ)無理数でリサンプリングできます。これは、多項式補間を使用するFarrow補間器を使用して効率的に実行できます。π


しかし、波形が44.1 /πkHzの場合はどうでしょうか?:)しかし、これは良いアドバイスです。ランダムなリサンプリングなどはありますか?または、実際には、新しいサンプルがx次元で均等に配置されるのではなく、y次元のビンに完全に収まるように、不均一にリサンプリングすることが完璧に機能すると思います。それを行う方法があるかどうかわからない
エンドリス

2
Farrow構造を使用して、「ランダム」リサンプラーを簡単に実装できます。これは、多項式(多くの場合3次)を使用して補間することにより、任意の非整数サンプル遅延を可能にするスキームです。NCOで使用されるものと同様のサンプル間位相アキュムレータを維持することができます。これは、各出力(リサンプリング)サンプルのサンプリング間隔の擬似ランダム分数で増分されます。アキュムレータの値は、Farrow補間器への入力として使用され、各出力の非整数遅延の量を定義します。
ジェイソンR

うーん、明確にするために、ファローは通常の古い多項式補間のプロセッサ/メモリ最適化バージョンですか?
エンドリス

1
はい。これは、多項式ベースの任意の非整数遅延を実装するための効率的な構造です。
ジェイソンR

ただし、3次補間は近似にすぎません。真のサンプル間ピークを知りたいのですが、極端なピークではうまく機能しないようです:stackoverflow.com/questions/1851384/… 実際、[...、-1、 1、-1、1、1、-1、1、-1、...]は無限のサンプル間ピークを生成しますが、実際にこれがどれほど重要かはわかりません。
エンドリス

0

ヒストグラムを平滑化する必要があります(これにより、カーネルメソッドを使用した場合と同様の結果が得られます)。スムージングの正確な実行方法は実験が必要です。たぶん、補間によって行うこともできます。平滑化に加えて、サンプリング周波数が入力の最高周波数よりも「大幅に高く」なるように波形をアップサンプリングすると、結果が改善されると思います。これは、正弦波がサンプリング周波数に関連し、ヒストグラムの少数のビンのみが取り込まれるような「トリッキー」な場合に役立つはずです。極端に取られた場合、十分に高いサンプルレートは、スムージングなしで素晴らしいプロットを提供するはずです。そのため、アップサンプリングと何らかの平滑化を組み合わせると、より良いプロットが得られます。

1kHzトーンの例を示しますが、プロットは予想どおりではありません。ここに私の提案があります(Matlab / Octaveコード)

pixels_vertical = 100;
% This needs to be tuned to your configuration and acceptance
upsampling_factor = 16*(pixels_vertical/100); 
fs_original = 48000;
fsine = 1000; % in Hz
fs_up = upsampling_factor*fs_original;
duration = 1; % in seconds
x = sin(2*pi*fsine*[0:duration*fs_up]/fs_up);
period_in_samples = fs_up/fsine;
hist_points = linspace(-1,1,pixels_vertical);
istart = 1;
iend   = period_in_samples;
pixel_values = hist(x(istart:iend), hist_points);
% smooth pixel values
[b,a] = butter(2,0.2);
pixel_values_smooth = filtfilt(b,a,pixel_values);
figure;hold on;
plot(hist_points, pixel_values);
plot(hist_points, pixel_values_smooth,'r');

あなたの1000Hzの音のためにあなたはこれを手に入れます ここに画像の説明を入力してください

必要なことは、upsampling_factor式を好みに合わせて調整することです。

それでも、要件が何であるかを100%正確に確認することはできません。しかし、上記のアップサンプリングとスムージングの原理を使用すると、1kHzトーン(Matlabで作成)でこれを取得できます。生のヒストグラムには、ヒットがゼロのビンが多数あることに注意してください。

ここに画像の説明を入力してください


ええ、本当にアルゴリズムの一部として何らかのタイプの補間が必要です。ヒストグラムは再構成された波形ではなく、離散点のものであるため、ヒストグラムだけを平滑化してもそれはできません。アップサンプリングが機能する唯一の方法は、垂直ピクセルよりも多くのサンプルがあるポイントまでそれを行う場合ですが、それは長い時間がかかる重い力ずくの方法です。
endolith

または、実際に補間することなく、出力に対する補間の効果を計算する
エンドリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.