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
試してみたところ、それらしい値を取得できました。
いろいろ試してみたいと思います。
これで解決とさせていただきます。
ありがとうございました。
|