• ベストアンサー

C言語でwavファイルをいじりたいのですが

C言語でwavファイルを操作したいと思っています。 一つは音量をdbで求めるというもので、自乗平均法を用いて音量を求め、時間変化を出力せよ。ただし、音量の単位はdb、区間長は30ms。 このような条件です。wavの読み込みはできるのですが、そこから進みません。 自乗平均法で調べると、株価がどうとかっていう資料だらけでよくわかりません。 2つ目は周波数スペクトルを求めるもので、音量に時間変化において、閾値以上の値が連続する区間における1024ポイントを対象とすること。 問題の意味がよくわかりません。。。 2点についてご教授いただけたらと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

1つ目は、要は、区間内の全数値について、二乗して、二乗値の平均を求めるだけです。 二乗平均平方根 が参考になるでしょうか。 http://ja.wikipedia.org/wiki/%E4%BA%8C%E4%B9%97%E5%B9%B3%E5%9D%87%E5%B9%B3%E6%96%B9%E6%A0%B9 音声信号処理なんかだと、最後に平方根は取らず、「二乗平均」で「パワー」(電力)を判定する場合が多いです。 (音声波形は通常「電圧」を表しますが、負荷抵抗が一定だと、 オームの法則により電流が電圧に比例し、電力は電圧×電流ですから、 電力は電圧の二乗に比例します) dB は、相対的な比率の単位です。 http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B7%E3%83%99%E3%83%AB この場合は、最大値(8bit wav なら127の二乗、16bit wav なら32767の二乗)との比を算出することになります。 2つ目は、フーリエ変換ですね。 http://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B フーリエ変換は処理が重いので、音声全域を処理することはあまりありません。ある区間を区切って、その範囲内での周波数スペクトルを算出します。 その区間を選ぶ基準が、「閾値以上の値が連続する区間」について、ってことなのでしょう。 離散フーリエ変換を高速に処理する「高速フーリエ変換(FFT)」は、 2のべき乗なサンプル数を処理する時に高速に処理できるので、 それが「1024ポイントを対象」とする理由かな。

r-ek9
質問者

お礼

とても参考になりました。ありがとうございました。

関連するQ&A