私はWAVファイル内の特定のタイムスタンプで特定の周波数範囲で0〜100の値を与えることができる単純なCアプリケーションを開発しようとしています。WAVファイル解析C(libsndfile、fftw3)
例:44.1kHz(標準MP3ファイル)の周波数範囲があり、その範囲をn個の範囲(0から始まる)に分割したいとします。私は今WAV-のデータを読み取ることができるよ
をLibsndfileが使用:私は、私がこれまで管理してきた
0から100までであること、各範囲の振幅を取得する必要がありますファイル。
しかし、私のFFTの理解はかなり限定されています。しかし、私が必要とする範囲で振幅を得ることが必要であることはわかっています。しかし、私はここからどうやって進むのですか?その目的に合ったライブラリFFTW-3が見つかりました。
私はここにいくつかの助けが見つかりました:https://stackoverflow.com/a/4371627/1141483
を、ここでFFTWのチュートリアルを見て:http://www.fftw.org/fftw2_doc/fftw_2.html
しかし、私はFFTWの行動が不明だとして、私はここから進行するのか分かりません。
もう1つ質問:libsndfileを使用すると仮定します。読み込みを強制的にシングルチャンネル(ステレオファイル)にしてサンプルを読み込むとします。あなたは実際には全体のファイルのサンプルの半分しか読み取っていませんか?それらの半分がチャンネル1から来ているか、自動的にそれらをフィルタリングしますか?
ご協力いただきありがとうございます。
EDIT:私のコードはここで見ることができます:
double blackman_harris(int n, int N){
double a0, a1, a2, a3, seg1, seg2, seg3, w_n;
a0 = 0.35875;
a1 = 0.48829;
a2 = 0.14128;
a3 = 0.01168;
seg1 = a1 * (double) cos(((double) 2 * (double) M_PI * (double) n)/((double) N - (double) 1));
seg2 = a2 * (double) cos(((double) 4 * (double) M_PI * (double) n)/((double) N - (double) 1));
seg3 = a3 * (double) cos(((double) 6 * (double) M_PI * (double) n)/((double) N - (double) 1));
w_n = a0 - seg1 + seg2 - seg3;
return w_n;
}
int main (int argc, char * argv [])
{ char *infilename ;
SNDFILE *infile = NULL ;
FILE *outfile = NULL ;
SF_INFO sfinfo ;
infile = sf_open(argv [1], SFM_READ, &sfinfo);
int N = pow(2, 10);
fftw_complex results[N/2 +1];
double samples[N];
sf_read_double(infile, samples, 1);
double normalizer;
int k;
for(k = 0; k < N;k++){
if(k == 0){
normalizer = blackman_harris(k, N);
} else {
normalizer = blackman_harris(k, N);
}
}
normalizer = normalizer * (double) N/2;
fftw_plan p = fftw_plan_dft_r2c_1d(N, samples, results, FFTW_ESTIMATE);
fftw_execute(p);
int i;
for(i = 0; i < N/2 +1; i++){
double value = ((double) sqrtf(creal(results[i])*creal(results[i])+cimag(results[i])*cimag(results[i]))/normalizer);
printf("%f\n", value);
}
sf_close (infile) ;
return 0 ;
} /* main */
Goz、あなたは真剣に私のヒーローです。助けてくれてありがとう。私は今それを読んでいて、あなたが明日に述べたものを実装しようとします:) –
@ThomasKobberPanum:いいえprobs :) – Goz
こんにちは、私はこれまでのコードを掲載しました。私はまだ重複を実装していません。私はちょうどいくつかの正規化された値を取得しようとしています。私は何が間違っているのか分かりません。私はまだこれらの巨大な数値を取得していますが、これはノーマライザの値がかなり低いので理にかなっていますが、何とか間違っているはずですか? –