2010-01-14 16 views
9

का तरंग प्लॉटिंग मैं विशिष्ट साजिश चौड़ाई के लिए .wav फ़ाइल के तरंग-रूप को प्लॉट करना चाहता था।.wav फ़ाइल

सही वेवफ़ॉर्म प्लॉट प्रदर्शित करने के लिए मुझे किस विधि का उपयोग करना चाहिए?

किसी भी सुझाव, ट्यूटोरियल, लिंक स्वागत कर रहे हैं ....

+0

क्यों C++ हालांकि? –

उत्तर

16

बेसिक एल्गोरिथ्म: नमूने ड्रा-विंडो में फिट करने के लिए की

  1. ढूँढें संख्या
  2. से प्रत्येक पिक्सेल के लिए निर्धारित कितने नमूने प्रत्येक पिक्सेल
  3. गणना आरएमएस (या चोटी) द्वारा प्रस्तुत किया जाना चाहिए मूल्य एक नमूना ब्लॉक। औसत ऑडियो सिग्नल के लिए काम नहीं करता है।
  4. मूल्यों को ड्रा करें।

की कि n (नमूनों की संख्या) = 44100, डब्ल्यू (चौड़ाई) = 100 पिक्सल मान लेते हैं:

तो प्रत्येक पिक्सेल 44100/100 == 441 नमूने (ब्लॉकसाइज)

for (x = 0; x < w; x++) 
    draw_pixel(x_offset + x, 
       y_baseline - rms(&mono_samples[x * blocksize], blocksize)); 
का प्रतिनिधित्व करना चाहिए

सामग्री विभिन्न दृश्य के लिए प्रयास करने के लिए दिखाई देते हैं:

  • आरएमएस बनाम अधिकतम मूल्य ब्लॉक
  • ओवरलैपिंग ख से ताले (x को अवरुद्ध करें लेकिन प्रत्येक पिक्सेल आदि के लिए अग्रिम x/2)

डाउनस्लैप्लिंग शायद काम नहीं करेगा क्योंकि आप चरम जानकारी खो देंगे।

+0

स्टीरियो सैंपल्स के मामले में क्या करना है? – Ashish

+1

स्टीरियो नमूने आमतौर पर अंतःस्थापित होते हैं ताकि आप नमूना सरणी से भी/विषम संख्या वाले नमूने ले सकें। एक तरंग/चैनल प्लॉट करें। – kauppi

2

लगभग अंकन के किसी भी प्रकार मंच विशिष्ट है। उस ने कहा, .wav फ़ाइलों का सबसे अधिक उपयोग विंडोज पर किया जाता है, इसलिए शायद यह एक उचित अनुमान है कि आप मुख्य रूप से विंडोज़ के लिए कोड में रुचि रखते हैं (या विशेष रूप से)। इस मामले में, यह ज्यादातर आपकी गति आवश्यकताओं पर निर्भर करता है। यदि आप एक काफी स्थिर प्रदर्शन चाहते हैं, तो आप केवल MoveTo और (अधिकतर) LineTo के साथ आकर्षित कर सकते हैं। यदि यह पर्याप्त तेज़ नहीं है, तो आप पॉलीलाइन जैसे कुछ उपयोग करके छोटी गति प्राप्त कर सकते हैं।

यदि आप इसे काफी तेज़ी से चाहते हैं, तो संभावना है कि ओपनजीएल या डायरेक्टएक्स ग्राफिक्स जैसे कुछ का उपयोग करना आपकी सबसे अच्छी शर्त है। इनमें से कोई भी ग्राफिक्स कार्ड पर वास्तविक काम का बहुमत है। यह देखते हुए कि आप ध्वनि तरंगों के ग्राफ को चित्रित करने के बारे में बात कर रहे हैं, यहां तक ​​कि कम अंत ग्राफिक्स कार्ड भी ड्राइंग को अनुकूलित करने के लिए बहुत कम या कोई काम नहीं करेगा, शायद उस पर लगभग फेंकने की संभावना के साथ आप आसानी से आसानी से रहेंगे।

संपादित करें: जहां तक ​​.wav फ़ाइल स्वयं पढ़ती है, the format बहुत आसान है। अधिकांश .wav फ़ाइलें असंपीड़ित पीसीएम नमूने हैं, इसलिए उन्हें चित्रण करना नमूना आकार और चैनलों की संख्या को जानने के लिए हेडर पढ़ने का एक साधारण मामला है, फिर डेटा को अपनी विंडो में फिट करने के लिए स्केल करना।

संपादित 2: आपके पास बाएं और दाएं चैनलों को संभालने के लिए कुछ विकल्प हैं। एक उन्हें दो अलग-अलग भूखंडों में खींचना है, आम तौर पर दूसरे के ऊपर एक। एक और उन्हें superimposed आकर्षित करने के लिए है, लेकिन विभिन्न रंगों में। जो अधिक उपयुक्त है, उस पर निर्भर करता है जो आप पूरा करने की कोशिश कर रहे हैं - यदि यह अधिकतर ठंडा दिखता है, तो एक अतिरंजित, बहु रंगीन साजिश शायद अच्छी तरह से काम करेगी। यदि आप उपयोगकर्ता को वास्तव में विस्तार से जांचने की अनुमति देना चाहते हैं, तो आप शायद दो अलग-अलग भूखंडों को चाहेंगे।

+0

मैंने wav फ़ाइल को पार्स किया है। लेकिन मुझे नहीं पता कि मैं विंडोज़ आकार के नमूनों को एकल मान पर औसत करता हूं या नहीं। बाएं और दाएं चैनल नमूना मूल्यों को कैसे संभालें। – Ashish

+0

मैंने डाउन-नमूना के बारे में कुछ भी नहीं जोड़ा है, क्योंकि ऐसा लगता है कि कूपी ने इसे काफी हद तक कवर किया है। –

0

एक तरंग से आपका क्या मतलब है? क्या आप सिग्नल ए.के.ए स्पेक्ट्रम में आवृत्ति घटकों के स्तर को साजिश करने की कोशिश कर रहे हैं, जो आमतौर पर मस्सी विज़ुअलाइज़र, कार स्टीरियो, बूमबॉक्स में देखे जाते हैं? यदि ऐसा है, तो आपको Fast Fourier Transform का उपयोग करना चाहिए। एफएफटी एक समय डोमेन सिग्नल को अपनी व्यक्तिगत आवृत्तियों में विभाजित करने के लिए एक मानक तकनीक है। बहुत अच्छी एफएफटी लाइब्रेरी दिनचर्या उपलब्ध हैं।

सी ++ में, आप openFrameworks लाइब्रेरी का उपयोग WAV के लिए एक संगीत प्लेयर स्थापित करने, एफएफटी निकालने और इसे आकर्षित करने के लिए कर सकते हैं।

आप का उपयोग Minim लाइब्रेरी के साथ करने के लिए भी कर सकते हैं। मैंने कोशिश की है और यह बहुत सरल है।

प्रसंस्करण में ओपनजीएल के लिए भी समर्थन है और यह उपयोग करने के लिए एक तस्वीर है।

3

या तो आरएमएस का उपयोग करें, ब्लॉकसाइज इस बात पर निर्भर करता है कि आप कितनी दूर ज़ूम इन हैं!

float RMS = 0; 
for (int a = 0; a < BlockSize; a++) 
{ 
    RMS += Samples[a]*Samples[a]; 
} 
RMS = sqrt(RMS/BlockSize); 

या न्यूनतम/अधिकतम (यह क्या शांत संपादित करें/Audtion का उपयोग करता है है)

float Max = -10000000; 
float Min = 1000000; 
for (int a = 0; a < BlockSize; a++) 
{ 
    if (Samples[a] > Max) Max = Samples[a]; 
    if (Samples[a] < Min) Min = Samples[a]; 
} 
+1

'मिन' और' अधिकतम 'का मूल्यांकन करते समय, इन चर के लिए प्रारंभिक मान के रूप में' नमूने [0] 'का उपयोग करने पर विचार करें –

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