アプリ版:「スタンプのみでお礼する」機能のリリースについて

等間隔で発生している衝撃音の間隔を、解析的に求めることはできるでしょうか?たとえば、拍手をしている周期であったり、太鼓を叩いている周期を演算で求めたいと思っています。もちろん、時間波形の間隔から周期を読み取ることはできますが、より周波数解析的な手法で求まらないかと考えています。音をPCに取り込んでFFT解析を行っても、拍手や太鼓一発の音そのものの周波数(数1000Hz)は算出されても、叩いている間隔(数Hz~10数Hz)は算出されません。FFT点数やウインドウ関数などをいろいろと変えてみましたが、結果は同じでした。ノイズはほとんどないものと仮定して結構です。どなたか教えていただけないでしょうか?

A 回答 (6件)

これならできる、という方法をお教えしましょう。

検出したいのは、簡潔に言えば、

  "拍手や太鼓一発の音そのもの"の交流信号

ではなく、

  "拍手や太鼓一発の音そのもの"の基本周波数信号の強度の時間変化

ですよね。なので、実際のマイクロホン出力から"拍手や太鼓一発の音そのもの"の
基本周波数近辺の成分だけを適当なバンドパスフィルタで抜き出し、それを整流(時定数
は~数十msくらいか)して直流信号化してやればいいだけの話です。音圧が時間変化
しなければ、出力は一定の直流信号になりますが、連続する拍手のような間欠音では
この出力はそれなりの周期で強弱の変化をするはずです。なので、この整流出力を
A/D変換してPCに取り込み、それをFFTしてやればOKです。前の回答者さんが答えて
いらっしゃるように、100Hzくらいでサンプリングしてやれば十分でしょう。

なお、バンドパスフィルタ+整流を外部回路でやる代わりに、マイクロホン出力を直接
A/D変換してPCに取り込み(これは質問者さんが既におやりになっている作業ですね)、
ソフトウェアで同期整流(ロックインアンプの信号処理。下記URL参照)してやれば、
バンドパスフィルタと整流が一度にできます。この計算結果を適当な時間間隔で間引き
or積分したものをFFTにかけてもOKです。

http://www.nfcorp.co.jp/keisoku/noise/li_genri2. …

あと、もう一つ。今おやりになっている方式を極力活かしたいなら、自己相関(下記URL参照)
をやるのも手です。ただし、入力データは基本波形の繰り返しが数回以上含まれる長さで
取り込んでおくことが必要です。

http://ja.wikipedia.org/wiki/%E8%87%AA%E5%B7%B1% …
(「ウィナー・ヒンチンの定理」のところの説明)

参考URL:http://www.nfcorp.co.jp/keisoku/noise/li_genri2. …

この回答への補足

ご回答、ありがとうございます!

おっしゃる通りで、求めたいのは「"拍手や太鼓一発の音そのもの"の基本周波数信号の強度の時間変化」になります。
この変化の周期を知りたいことになります。
実際は人の拍手よりは早い連続衝撃音を解析したいと思っていまして、その周期は10~50Hz程度です。

単純にサンプリング周波数を下げて(200Hz)音を取り込み、普通にFFTしてみたのですが…、どうもイメージ通りの結果になりません。
実際の周期よりも随分高い周波数になってしまいます。
分解能が高くなるように、長時間記録してFFTの点数も増やしているのですが…。

電気系は(電気系も?)チンプンカンプンなので、整流やロックインアンプは良く分からないです…。
ですが、同じ内容になるかと思って、取り込んだ波形から時定数を掛けた実効値を求めて、その結果をFFTしてみました。
ほぼイメージ通りの結果が出ました!

ただ、波形信号がすべて+の値のせいでしょうか?
FFT結果の直流に近い成分(0~10Hz程度)が非常に大きく現れてしまい、10数Hzの周期については解析が困難です。
この直流成分をカットすることはできるのでしょうか?
ハイパスフィルターを通すしかないのでしょうか?

自己相関の解析もやってみたのですが、一つ一つの衝撃音自体、あるいはその間隔に微妙なバラつきがあるせいか、うまく結果が出ないです…。

補足日時:2007/08/23 17:52
    • good
    • 0

補足を見る限り


回答の主旨を理解されているとは思えません

もう一度周波数解析の基本に立ち返って検討なされますことを
    • good
    • 0

> この直流成分をカットすることはできるのでしょうか?


> ハイパスフィルターを通すしかないのでしょうか?

基本的にはそうですが、ノイズ成分が無視できるなら、簡便には「微分」で代用できる
ことも多いです。更にソフト処理では「微分」は「差分」(何点か離れたデータ間の差を
新たなデータとする)で代用できます。
ノイズが気になる場合は、まじめに低周波成分の除去をしますが、ソフト的には十分
長い点数の単純平均を計算し、元データからそれを差っ引けばベースライン(低周波
成分)を補正できます。
    • good
    • 0

FFTするより、自己相関関数を計算したほうが、直感的に理解しやすいのでは。



※実はやってることは本質的にはFFTと全く同じなんですが(ウィーナ・ヒンチン)。

この回答への補足

ご回答、ありがとうございます!

とりあえずやってみたことを、ANo.2の補足に書いていますので、見ていただきたいと思います!

補足日時:2007/08/23 18:03
    • good
    • 0

FFTの原理で最低周波数はデータ長で規定されます



そのFFTは何データ処理でしょう
1024,2048・・・
20KHzサンプリングで2048データならば、周波数範囲は概略10~10Khzになります
ですから0.1秒より長い周期は解析できません

100Hzでサンプリングするには50Hzのローパスフィルタを通さなければなりません
そこで簡易的に 5ミリ秒間の平均データを5ミリ秒のサンプリング値としたらそれなりの解析ができるのでは・・です

20Khzサンプリングでは5ミリ秒で100データです、この平均を代表値とすることでローパスフィルタを通過させた信号に近似させることを期待しています
本来ならば 50Hz程度のディジタルフィルタ処理して、それを100hz程度でサンプリングした信号として その信号をFFT処理すれば 0.1hz程度までは解析できるのではと想定しています
FFTの性能によってはもう少し低いサンプリング周波数が必要かもしれません

だいぶ前ですが 1hzのサンプリングで十数秒から数十秒周期の信号を解析しました
アクティブ素子を使用したローパスフィルタやより高速でサンプリングした信号をディジタルフィルタで処理したりして


拍手そのものの解析か、拍手の周期の解析かで着眼点を代えなければなりません
前の回答でラグと表現したのは前後何データ分まで解析するか(事故相関を取るか)の意味です これが解析できる最低周波数を制約します

この回答への補足

たびたびありがとうございます!

あくまで、拍手の周期の解析が行いたいのです。
(実はより複雑なんですが、その取っ掛かりとしてです。)

とりあえずの進捗は、ANo.2の補足に書きます!

補足日時:2007/08/23 17:49
    • good
    • 0

FFTでも充分なデータ長(データ数)とそれを解析できる能力があれば可能です



最低でも拍手の10周期分程度のデータは必要です

数Khzを解析する状況だと 数Hzの解析は、データのラグ 1000以上になりますから FFTプログラムの機能によっては無理があると思います
(FFTは最高周波数/最低周波数 が100~1000程度と思われます、確認してください)

100hz程度でサンプリングするか、5ミリ秒毎の平均データを使用してみたら如何でしょうか

この回答への補足

さっそくのご回答、ありがとうございます!

録音および解析は、1分間録音したデータを使っています。
現在のサンプリング周波数は、できるだけ可聴域に近い音の解析が必要かと思い、20kHzでサンプリングしています。
ナイキストの関係で、10kHzまでの解析が可能かと思いますので、FFTの上限周波数は10kHzです。
下限周波数の設定は…通常FFTではできないですよね?
0Hzからになっていると思います。
このような設定でFFTを行い、加算アベレージを行ったグラフを見ています。

「データのラグ」とは何でしょうか?

FFT点数を頑張って(?)8192点ぐらいで解析すると、FFT後の周波数分解能が2.5Hz弱になっています。

outerlimitさんのご指摘は、サンプリング周波数をもっと落として解析する必要があるということですよね?
100Hzサンプリングで録音しても、手拍子の音は記録されるのでしょうか?
手拍子自体の音は、もっと高い音だと思うのですが…。

実際にやってみればいいのですが、今はその環境にいないもので…。
理解不足なら申し訳ないです。

補足日時:2007/08/22 17:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!