トップページ > 記事閲覧
GetFFTVibrationSoftSoundでの振幅の値取得について
名前:FFT初心者 日時: 2022/11/16 17:14

こんにちは、いつもDXライブラリにお世話になっております。 GetFFTVibrationSoftSoundで振幅の一番大きい周波数の振幅を取得しようとしています。 おそらくParamListに振幅の値が入っているのではないかと思うのですが、値がマイナスに振れていたり、それを *(-1) によって自然数に戻せなかったりとなっていてよくわからないです。 振幅の値を正しく取得するにはどうしたらよいのでしょうか。 ご教授のほどよろしくお願いいたします。
メンテ

Page: 1 |

Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.1 )
名前:管理人 日時:2022/11/17 00:59

GetFFTVibrationSoftSound は正常に動作した場合は ParamList にマイナスの値が入ることはありませんので 何かプログラムにバグがあるのではないかと思います よろしければ現状のプログラムを掲示板に貼り付けていただけないでしょうか?
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.2 )
名前:FFT初心者 日時:2022/11/17 11:22

#include "DxLib.h" #include <fstream> #include <string> #include <stdio.h> #define SAMPLENUM /* 1024 */ /* 2048 */ /* 4096 */ /* 8192 */ /* 16384 */ 32768 /* 65536 */ // 値が大きいほど精度が高い ( 最大 65536 ) #define BUFFERLENGTH 22050 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Sound; int i, j; int a; //int MaxIndex; //float MaxParam; float ParamList[ BUFFERLENGTH ]; float Param[ BUFFERLENGTH ]; int SamplePos; // ウインドウモードで起動 // ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // サウンドファイルの読み込み Sound = LoadSoftSound( "sine_-06_05_00200.wav" ); // ソフトサウンドハンドルからサウンドハンドルを作成 // SoundHandle = LoadSoundMemFromSoftSound( Sound ); // PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP); //サウンドファイルのサンプル数の読み込み SamplePos = ( int )GetSoftSoundSampleNum(Sound); //44100毎に出力された振幅情報の中で一番振幅が大きい周波数を検出(出力数) aで一秒を何分割するか指定 a = 1; int sec = (SamplePos) * a / 44100; float MaxParam [ sec ]; int MaxIndex [ sec ]; // 出力された振幅情報の中で一番目と二番目に振幅が大きい周波数を検出 for( i = 0 ; i < sec ; i++){ GetFFTVibrationSoftSound( Sound, -1, i*(SamplePos * a /44100), SAMPLENUM, ParamList, BUFFERLENGTH); Param[ 0 ] = ParamList[ 0 ]; if( Param[ 0 ] < 0){ Param[ 0 ] = Param[ 0 ] * (-1); } MaxParam[ i ] = ParamList[ 0 ]; MaxIndex[ i ] = 0; for( j = 1 ; j < BUFFERLENGTH ; j ++ ){ Param[ j ] = ParamList[ j ]; if( Param[ j ] < 0){ Param[ j ] = Param[ j ] * (-1); } if( MaxParam[ i ] < Param[ j ]){ MaxIndex[ i ] = j; MaxParam[ i ] = Param[ j ]; } } } //実行結果をファイルに格納 FILE *out = fopen("output.txt", "w"); for( i = 0; i<sec; i++){ fprintf(out, "周波数:%d 振幅:%d\n",MaxIndex[ i ], MaxParam[ i ]); } fclose(out); // サウンドファイルの破棄 DeleteSoftSound( Sound ); // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } というコードを実行しました。周波数は200と期待通りの値が取れているのですが、振幅は値がマイナスにぶれてしまっていたり、最大振幅が0になっていたりと安定しません。 下に実行結果ファイルoutput.txtの中身貼ります。 周波数:200 振幅:0 周波数:200 振幅:1610612736 周波数:200 振幅:-1610612736 周波数:200 振幅:536870912 周波数:200 振幅:0 周波数:200 振幅:-1610612736 なお、sine_-06_05_00200.wavは、 https://hashimoto-tech.jp/local/advan/signwav のサイトからお借りしました。
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.3 )
名前:管理人 日時:2022/11/18 00:48

プログラムの貼り付けありがとうございます 手元で試してみた限りでは fprintf(out, "周波数:%d 振幅:%d\n",MaxIndex[ i ], MaxParam[ i ]); ↑ こちらの『振幅:%d』の部分ですが、『MaxParam[ i ]』は float型なので %d ではなく %f にする必要があります なので『振幅:%d』を『振幅:%f』にしてみてください m(_ _)m
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.4 )
名前:FFT初心者 日時:2022/11/18 08:29

全然気づきませんでした…。 修正したところ、期待どうりの値を出しました。 ありがとうございました。
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.5 )
名前:FFT初心者 日時:2022/11/18 11:31

すみません。いろいろ試してみたところ、振幅の値がうまく出力されていないように感じるのでもう一度質問させてください。 取り込んだ曲に関係なく曲の後半に行くにつれて振幅が大きく出力されているように感じます。 試しに、振幅が極端な下urlのジングルをwaveファイルに変換してみたところ、最大値が出ているのが6秒地点になっており、ほぼ曲としては無音の位置を指していました。 (送信できなかったのでurl一部変更しました。@部分を:に変えてください。) https@//dova-s.jp/bgm/play2791.html 下に実行結果貼ります。 周波数:304 振幅:0.029605 周波数:304 振幅:0.029669 周波数:304 振幅:0.029736 周波数:304 振幅:0.029796 周波数:304 振幅:0.029845 周波数:304 振幅:0.029881 周波数:304 振幅:0.029903 お忙しいところ申し訳ありませんが、解決方法わかりましたらご教授いただけるとありがたいです。 よろしくお願いいたします。
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.6 )
名前:管理人 日時:2022/11/19 02:29

プログラムを改めて確認させて頂いたところ、こちらの行の GetFFTVibrationSoftSound( Sound, -1, i*(SamplePos * a /44100), SAMPLENUM, ParamList, BUFFERLENGTH); こちらの式が誤っています i*(SamplePos * a /44100) こちらにはFFT処理を施す開始位置を指定するのですが、単位はサンプル数なので、秒間44100サンプルの サウンドファイルの場合は i*44100 となります よろしければお試しください m(_ _)m
メンテ
Re: GetFFTVibrationSoftSoundでの振幅の値取得について ( No.7 )
名前:FFT初心者(解決) 日時:2022/11/21 12:32

試してみたところ、それらしい値を取得できました。 いろいろ試してみたいと思います。 これで解決とさせていただきます。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存