質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

c言語での音声データの読み込み

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,249

score 12

音声データのrawファイルをcのプログラムで読み込み、引数で与えた開始と終了時間の音声波形をgnuplotかexcelで表示したいのですが、rawファイルをどう読み込めばいいのか、どう引数を与え音声波形を表示すればいいのかわかりません。

追加情報

サンプリングで使うデータについて分かることは16KHzのデータで16bitです。チャンネルはモノラルでエンディアンについては申し訳ないのですがわかりません。

使用しているOSはRetHat Enterprise Linux5のUNIX系のOSです。

関数freadを使用して出来ないかと考えていたのですが、どうソースコードを書けばいいかよくわかりません。
構成のヒントを教えてくださると助かります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ikedas

    2016/11/23 20:08

    raw形式は色々バラエティがあるので、データ作成時に次のパラメータをどのようにしているか教えてください: 量子化ビット数 (8の倍数だと思います)、チャネル数 (モノラル音声なら1)、エンディアン (量子化ビット数が8より大きいとき必要)、サンプリング周波数。また、Cのプログラムを実行するOSとアーキテクチャ (CPUの種類) も教えてください (エンディアンに関係があります)。

    キャンセル

  • ikedas

    2016/11/23 20:11

    あ、回答された方がいますね。そういうことです。

    キャンセル

回答 2

checkベストアンサー

+3

rawといってもPCMデータをヘッダ情報なしで生のまま格納したものということなので、まずその中にどんなデータが入っているかを知る必要があります。大抵の場合次のバリエーションを想定すればいいと思います。

  • サンプルのbit幅(8/16)
  • 負号有無(singed/unsigned)=C言語のsigned/unsignedと同じ意味
  • エンディアン(big/little)=16bitの場合下位バイトが先(little)か後(big)か
  • チャンネル数(モノラル、ステレオ)=ステレオならL,Rが交互に並ぶ
  • 周波数(CD品質なら44.1KHz)=波形には直接関係しませんが再生の際に関係しますね。

まずはCの標準ライブラリーを用いてファイルを読みその中身を上記のバリエーションのどれかを仮定して解析してみたらよいと思います。例えば16bit,signed,little-endian,ステレオなら次のように入っています。(ステレオの場合左右どちらが先か自分は正確に知りません。以下は左が先と仮定しています)

0x00 - 左スピーカー用: 下位8bit(負号付き)
0x01 - 左スピーカー用: 上位8bit(負号付き)
0x00 - 右スピーカー用: 下位8bit(負号付き)
0xFF - 右スピーカー用: 上位8bit(負号付き)
==> 最初のサンプルデータは 左: 256 右:-256
以下同様

描画についてはExcelであれば上記をCSV形式として出力しそれをExcelで読み込んでとりあえず折れ線グラフとして表示すると波形が見えると思います。ただあまりサンプル数が多いとExcelで表示するのは厳しいかもしれません。gnuplotについては経験ないのでわかっていませんが、こういったサイトを参考にされてはいかがでしょう。


追記:
endianは個人PCの世界ではインテル系の石が多い(?)ように思うのでひとまずlittle-endian, signedだと仮定し実際の波形を見たり再生すると見当がつくと思います。再生の際はイヤホンを耳からちょっと離したりvolumeを絞るようにした方が安全かも知れません。
読み込みについてはfreadでもfgetcでもよいと思います。CPUと同じエンディアン、shortの語長が2byteと仮定するならモノラルデータはshortの配列へ直接読み込むと簡単です。

(手元にCがないので間違いがあったらご容赦)

#define BYTES_PER_SAMPLE sizeof(short)
#define NATIVE_ENDIAN TRUE // CPUと同じエンディアンか?

int main(int argc, const char* argv[]) {
  FILE fp = fopen("...", "r");
  size_t sample_length = 1000; // サンプル数:ファイル長から求めた方が柔軟
  size_t buffer_size = sample_length * BYTES_PER_SAMPLE;
  short* buffer = (short*)malloc(buffer_size);
  size_t i;
  short  temp;

  size_t samples = fread(buffer, BYTES_PER_SAMPLE, sample_length, fp);
  // これでsample_length分のPCMサンプルがbuffferに読み込めるはず

  // もしエンディアンがPCのプロセッサと逆ならバイト順を入れ替える
  if (!NATIVE_ENDIAN) {
    for (i = 0; i < samples; i++) {
      temp = buffer[i];
      buffer[i] = (short)(((temp >> 8) & 0xff) | (temp << 8));
    }
  }

  ...
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

rawファイルの種類を調べるにはaudacity を使って取り込んで自分で聞くのがお勧めです。取り込む際、いろいろパラメター選ぶが、正しく選んだ場合だけ、正しい音声が聞こえます。

取り込み方法はこの動画ご参考ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る