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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

8032閲覧

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

straycat

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2016/11/23 09:24

編集2016/11/23 12:09

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

追加情報

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2016/11/23 11:08

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

2016/11/23 11:11

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

回答2

0

ベストアンサー

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がないので間違いがあったらご容赦)

c

1#define BYTES_PER_SAMPLE sizeof(short) 2#define NATIVE_ENDIAN TRUE // CPUと同じエンディアンか? 3 4int main(int argc, const char* argv[]) { 5 FILE fp = fopen("...", "r"); 6 size_t sample_length = 1000; // サンプル数:ファイル長から求めた方が柔軟 7 size_t buffer_size = sample_length * BYTES_PER_SAMPLE; 8 short* buffer = (short*)malloc(buffer_size); 9 size_t i; 10 short temp; 11 12 size_t samples = fread(buffer, BYTES_PER_SAMPLE, sample_length, fp); 13 // これでsample_length分のPCMサンプルがbuffferに読み込めるはず 14 15 // もしエンディアンがPCのプロセッサと逆ならバイト順を入れ替える 16 if (!NATIVE_ENDIAN) { 17 for (i = 0; i < samples; i++) { 18 temp = buffer[i]; 19 buffer[i] = (short)(((temp >> 8) & 0xff) | (temp << 8)); 20 } 21 } 22 23 ... 24}

投稿2016/11/23 10:54

編集2016/11/26 17:23
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2016/11/23 11:59

izayoi

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問