मैं एक साधारण सी अनुप्रयोग विकसित करने की कोशिश कर रहा हूं जो एक डब्ल्यूएवी-फ़ाइल में दिए गए टाइमस्टैंप पर एक निश्चित आवृत्ति सीमा पर 0-100 से मूल्य दे सकता है।डब्ल्यूएवी-फाइल विश्लेषण सी (libsndfile, fftw3)
उदाहरण: मेरे पास 44.1kHz (सामान्य एमपी 3 फ़ाइल) की आवृत्ति रेंज है और मैं उस सीमा को श्रेणियों की संख्या (0 से शुरू) में विभाजित करना चाहता हूं। मैं तो, प्रत्येक रेंज के आयाम प्राप्त करने की आवश्यकता 0 से 100 के
मैं अब तक क्या प्रबंधित किया है करने के लिए किया जा रहा है:
का उपयोग libsndfile अब मैं एक WAV- के डेटा को पढ़ने में सक्षम हूँ फ़ाइल।
infile = sf_open(argv [1], SFM_READ, &sfinfo);
float samples[sfinfo.frames];
sf_read_float(infile, samples, 1);
हालांकि, एफएफटी की मेरी समझ सीमित है। लेकिन मुझे पता है कि मुझे आवश्यक श्रेणियों में आयाम प्राप्त करने के लिए जरूरी है। लेकिन मैं यहां से कैसे आगे बढ़ूं? मुझे पुस्तकालय FFTW-3 मिला, जो उद्देश्य के लिए उपयुक्त प्रतीत होता है।
मैं यहाँ कुछ मदद मिली: https://stackoverflow.com/a/4371627/1141483
और FFTW ट्यूटोरियल यहाँ को देखा: http://www.fftw.org/fftw2_doc/fftw_2.html
लेकिन जैसा कि मैंने FFTW के व्यवहार के बारे में अनिश्चित हूँ, मैं यहाँ से प्रगति के लिए पता नहीं है ।
और एक और सवाल, मान लीजिए कि आप libsndfile का उपयोग करते हैं: यदि आप पढ़ने को एकल चैनल (स्टीरियो फ़ाइल के साथ) करने के लिए मजबूर करते हैं और फिर नमूने पढ़ते हैं। क्या आप वास्तव में केवल कुल फ़ाइल के नमूने के आधा पढ़ रहे होंगे? उनमें से आधा चैनल 1 से है, या स्वचालित रूप से उनको फ़िल्टर करता है?
आपकी मदद के लिए धन्यवाद एक टन।
संपादित करें: मेरी कोड यहाँ देखा जा सकता:
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
हाय गोज़, मैंने अभी तक अपना कोड पोस्ट कर दिया है। मैंने अभी तक ओवरलैपिंग लागू नहीं किया है। मैं बस कुछ सामान्य मूल्यों को शुरू करने की कोशिश कर रहा हूं। मैं नहीं देख सकता कि मैं क्या गलत कर रहा हूं? मुझे अभी भी इन बड़ी संख्याएं मिलती हैं, जो समझ में आता है क्योंकि सामान्यीकृत मान कम है ... लेकिन यह किसी भी तरह गलत होना चाहिए? –