2017-08-08 13 views
2

私はオーディオファイルで初めてcでプログラミングしています。私はおそらくオーディオファイルを読んで、オーディオ波を分析するためにいくつかの情報を含むcsvファイルを書き込むべきであるというこのコードを見つけました。その場合は単純な声になります:私は波の振幅に興味があります声の高さとその高さと拡張。符号化されたオーディオファイルを信号値のテキストに変換する

  main() { 
      // Create a 20 ms audio buffer (assuming Fs = 44.1 kHz) 
      int16_t buf[N] = {0}; // buffer 
      int n;    // buffer index 

      // Open WAV file with FFmpeg and read raw samples via the pipe. 
      FILE *pipein; 
      pipein = popen("ffmpeg -i whistle.wav -f s16le -ac 1 -", "r"); 
      fread(buf, 2, N, pipein); 
      pclose(pipein); 

      // Print the sample values in the buffer to a CSV file 
      FILE *csvfile; 
      csvfile = fopen("samples.csv", "w"); 
      for (n=0 ; n<N ; ++n) fprintf(csvfile, "%d\n", buf[n]); 
      fclose(csvfile); 

     } 

誰かが私に詳細を説明することができますか?オーディオファイルを読み込んで、必要な情報をどのように抽出することができますか?このコードを参照すると、誰かが私にライン8のパイプの意味を説明することができます

pipein = popen("ffmpeg -i whistle.wav -f s16le -ac 1 -", "r"); 

p.s.私はすでに多くの有用な情報を含んでいるオーディオファイルのヘッダーを読む方法を知っていますが、サンプルごとにオーディオファイル全体を分析したいと思っています。

答えて

3

私だけでコンパイルは、あなたのコードを実行した...出力ファイルsamples.csvがあなたの入力音声曲線のサンプルのそれぞれを表し、符号付き16ビット整数の垂直列である...のよう:YMMV

曲線がその沈黙をウォブルに失敗したときにオーディオがとても曲線である -
-20724 
-19681 
-18556 
-17359 
-16096 
-14766 
-13383 
-11940 
-10460 
-8928 
-7371 
-5778 
-4165 
-2536 
-897 
749 
2385 
4019 
5633 
7224 
8793 
10318 
11811 
13251 
14644 
15977 
17247 

...その生のオーディオは、あなたの質問

ボリュームに答えるために、あなたの上記のコードに追加することができますあなたの変数bufしている間にそう。 ..ボリュームを計算するときにビット深度の意味を理解することは非常に重要です...私はあなたが16ビットのビット深度を持っていることを知っているあなたが整数値の可能な数を知らせる...空白の凝視でread up on PCM raw audio ...最初の近似にあなたのコードに次の変更は、あなたのオーディオのビット深度を知るボリューム

int min_value = 9999; 
int max_value = -9999; 

for (n=0 ; n < N ; ++n) { 

    if (buf[n] < min_value) min_value = buf[n]; 
    if (buf[n] > max_value) max_value = buf[n]; 

    fprintf(csvfile, "%d\n", buf[n]); 
} 

fclose(csvfile); 

printf("min_value %d\n", min_value); 
printf("max_value %d\n", max_value); 

が、その後は2^16の可能な異なる整数値を持って、その16ビットを言うことができますことを教えてくれます...(65536から0言うから - 1)あなたの生のオーディオのカーブを表現します。つまり、あなたのデータが署名されていない場合...符号付き整数(WAVファイルヘッダーで定義されている)がその範囲を0センタリングするようにシフトすると...範囲は-32768から(+32768 - 1)または-32768から+32767になります...もしあなたのオーディオbuf[n]の値が完全な可能性を横切るならば最小値から最大値までの範囲で、サンプルのオーディオストレッチはフルボリュームであると言えるでしょう...ここで、上記の測定値を解釈する位置にあります:min_valueとmax_value ... min_valueが-16384の場合、if max_valueは約+16384であり、ボリュームは可能な整数値の範囲の半分しか消費していないので最大値の約半分になる。

0から1の範囲のボリューム(最小から最大ボリューム)この式を使用して過度に簡略化する)

num_possible_ints = 2^bit_depth // == 65536 for bit depth of 16 bits 
volume = 1 - (num_possible_ints - (max_value - min_value))/num_possible_ints 

なぜこの単純過ぎるのですか?あなたのオーディオバッファを前処理することなく[必要に応じて、最大または最小に跳ね返ることはめったにない外向きのオーディオサンプルを破棄することによって]このアプローチは、ボリューム測定値をあまりにも高くする傾向があります。

ボリューム知覚バイアスへの傾向気... lookup Root Mean Square to calculate volume with better accuracy ... to quote :

RMSは、波形と線形ゼロライン(0デシベルではないが、軸)の間の領域を信号により変位面積を平均化されます。

スイングの極性は無視しなければなりません。スイングの極性は無視してください。幸いなことに、数学では、それ自体が乗算されたもの(正方形)は正に終わります。正と負の半分が互いに打ち消し合わないので、信号は平均化され(タイムライン/ウィンドウEDの言及またはその積分時間にわたって算術平均される)、最後に二乗の逆数が実行される。

RMSは、信号の2乗の平方根または算術平均の平方根を意味します。

実際には、振幅が大きく、スパイク状の過渡成分の信号は、同じエネルギー量を持つため振幅が小さくて波形が粗いものと同じRMS値を持つことができます。あなたが話し手にそれらを置く場合、彼らは両方とも同じ音響エネルギー出力を生成する必要があります。

典型的なスパイク波形はドラム・トランジェントのようなものですが、太い波形は正弦波または矩形波(得られる限り脂肪)ですが、同じパワーを得るためにはるかに低いピーク・レベルが必要です1.4Vpの波は1.0Vpの方形波と同じRMSレベルです)。これはあなたがPSpopen is doing a stream read from the input file

を始める必要があります

...

関連する問題