2013-04-18 9 views
10

में डब्ल्यूएवी फ़ाइल डेटा को पढ़ना और प्रसंस्करण करना मैं वर्तमान में एक बहुत ही महत्वपूर्ण स्कूल प्रोजेक्ट कर रहा हूं। मुझे सी/सी ++ में WAVE फ़ाइल की जानकारी निकालने की आवश्यकता है और वॉयस सिग्नल के एलपीसी प्राप्त करने के लिए जानकारी का उपयोग करें। लेकिन, ऐसा करने के लिए, मुझे सिग्नल में कुछ प्री-प्रोसेसिंग करने की ज़रूरत है, जैसे कि अन्य चीजों के साथ शून्य क्रॉसिंग और ऊर्जा विश्लेषण करना। जिसका अर्थ है कि मुझे संकेत और वास्तविक मूल्य की आवश्यकता है। समस्या यह है कि मुझे नहीं पता कि उपयोगी जानकारी कैसे प्राप्त करें और उसके लिए सही प्रारूप कैसे प्राप्त करें। मैंने पहले से ही फ़ाइल में हर एक फ़ील्ड पढ़ा है, लेकिन मुझे यकीन नहीं है कि मैं इसे सही कर रहा हूं। सुझाव, कृपया?सी/सी ++

इस तरह से मैं इस समय फ़ाइल को पढ़ने है:

Readi = fread (& bps, 1, 2, ऑडियो); printf ("प्रति नमूना =% d \ n", बीपीएस);

अग्रिम धन्यवाद।

+3

http://www.mega-nerd.com/libsndfile/ http://ccrma.stanford.edu/software/snd/sndlib/ दो पुस्तकालय हैं जो आपको डब्ल्यूएवी – Patashu

उत्तर

15

मेरी पहली सिफारिश आपको मदद करने के लिए किसी प्रकार की लाइब्रेरी का उपयोग करना होगा। अधिकतर ध्वनि समाधान ओवरकिल लगते हैं, इसलिए एक साधारण लाइब्रेरी (जैसे आपके प्रश्न की टिप्पणी में अनुशंसित एक, libsndfile) चाल चलाना चाहिए।

यदि आप सिर्फ डब्ल्यूएवी फाइलों को पढ़ने के बारे में जानना चाहते हैं तो आप अपना खुद का लिख ​​सकते हैं (क्योंकि आपका स्कूल किसी अन्य नियमित व्यक्ति की तरह लाइब्रेरी का उपयोग करने पर नाक बदल सकता है), एक त्वरित Google खोज आपको देगी आपको जिस जानकारी की आवश्यकता है plus some people who have already wrote many tutorials on reading the .wav format

यदि आपको अभी भी यह नहीं मिलता है, तो यहां मेरा कुछ कोड है जहां मैंने हेडर और WAV/RIFF डेटा फ़ाइल के अन्य सभी हिस्सों को तब तक पढ़ा जब तक कि मैं डेटा खंड में नहीं जाता। यह exclusively off the WAV Format Specification पर आधारित है। वास्तविक ध्वनि डेटा निकालना बहुत कठिन नहीं है: आप या तो इसे कच्चे पढ़ सकते हैं और कच्चे का उपयोग कर सकते हैं या उस प्रारूप में रूपांतरण कर सकते हैं, जिसमें आपको आंतरिक रूप से अधिक आराम मिलेगा (32-बिट पीसीएम असम्पीडित डेटा या कुछ)।

नीचे दिए गए कोड को देखते समय, reader.Read...(...) को fread समकक्ष मानों और संकेत प्रकार के बाइट आकार के लिए कॉल करें। WavChunks एक enum एक WAV फ़ाइल हिस्सा के अंदर है कि आईडी की लिटल एन्डियन मान है, और format चर WAV प्रारूप प्रकार जिस प्रकार की WAV फ़ाइल स्वरूप में निहित किया जा सकता है में से एक है:

enum class WavChunks { 
    RiffHeader = 0x46464952, 
    WavRiff = 0x54651475, 
    Format = 0x020746d66, 
    LabeledText = 0x478747C6, 
    Instrumentation = 0x478747C6, 
    Sample = 0x6C706D73, 
    Fact = 0x47361666, 
    Data = 0x61746164, 
    Junk = 0x4b4e554a, 
}; 

enum class WavFormat { 
    PulseCodeModulation = 0x01, 
    IEEEFloatingPoint = 0x03, 
    ALaw = 0x06, 
    MuLaw = 0x07, 
    IMAADPCM = 0x11, 
    YamahaITUG723ADPCM = 0x16, 
    GSM610 = 0x31, 
    ITUG721ADPCM = 0x40, 
    MPEG = 0x50, 
    Extensible = 0xFFFE 
}; 

int32 chunkid = 0; 
bool datachunk = false; 
while (!datachunk) { 
    chunkid = reader.ReadInt32(); 
    switch ((WavChunks)chunkid) { 
    case WavChunks::Format: 
     formatsize = reader.ReadInt32(); 
     format = (WavFormat)reader.ReadInt16(); 
     channels = (Channels)reader.ReadInt16(); 
     channelcount = (int)channels; 
     samplerate = reader.ReadInt32(); 
     bitspersecond = reader.ReadInt32(); 
     formatblockalign = reader.ReadInt16(); 
     bitdepth = reader.ReadInt16(); 
     if (formatsize == 18) { 
      int32 extradata = reader.ReadInt16(); 
      reader.Seek(extradata, SeekOrigin::Current); 
     } 
     break; 
    case WavChunks::RiffHeader: 
     headerid = chunkid; 
     memsize = reader.ReadInt32(); 
     riffstyle = reader.ReadInt32(); 
     break; 
    case WavChunks::Data: 
     datachunk = true; 
     datasize = reader.ReadInt32(); 
     break; 
    default: 
     int32 skipsize = reader.ReadInt32(); 
     reader.Seek(skipsize, SeekOrigin::Current); 
     break; 
    } 
} 
+1

के साथ काम करने में मदद कर सकते हैं आरआईएफएफ हेक्स में पीछे क्यों लिखा गया है? मुझे छोटे/बड़े एंडियन के बारे में पता है, लेकिन मैंने जो हेक्स संपादकों का उपयोग किया है, वे इसे एफएफआईआर के बजाय आरआईएफएफ के रूप में दिखाते हैं, क्या वे दृश्यों के पीछे कुछ अजीब रूपांतरण कर रहे हैं, या कुछ और चल रहा है? – MarcusJ

+0

मेरा मानना ​​है कि @MarcusJ को आरआईएफएफ को सही पढ़ना चाहिए, यहां लहर प्रारूप का विवरण है http://soundfile.sapp.org/doc/WaveFormat/ इसलिए मेरा मानना ​​है कि यह RiffHeader = 0x52494646 होना चाहिए क्योंकि प्रारूप यह कहता है कि यह एक बड़ा है -इंडियन क्षेत्र – alexm

संबंधित मुद्दे