2011-08-14 18 views
7

मैं Visualizer कक्षा का उपयोग कर एंड्रॉइड में एक ऑडियो स्पेक्ट्रम विश्लेषक को लागू करने की कोशिश कर रहा हूं।मेरा एफएफटी विंडोज मीडिया प्लेयर की तुलना में एक अलग विज़ुअलाइज़र आउटपुट क्यों देता है?

मैं OnDataCaptureListener() घटना के onFftDataCapture() विधि में FFT डेटा हो रही है और मुझे लगता है कि ड्राइंग हूँ कैनवास drawLines() के प्रयोग पर।

लेकिन स्पेक्ट्रम प्रदर्शन ठीक से प्रदर्शित नहीं हो रहा है। मैं केवल ग्राफ के बाईं ओर परिवर्तन देख सकता हूं। लेकिन विंडो मीडिया प्लेयर में, एक ही गीत का आउटपुट अलग है। मुझे क्या याद आ रहा है

क्या कोई इस पर उदाहरण या लिंक के साथ मेरी सहायता कर सकता है?

कोड

mVisualizer.setDataCaptureListener(
      new Visualizer.OnDataCaptureListener() { 

       public void onWaveFormDataCapture(Visualizer visualizer, 
         byte[] bytes, int samplingRate) {} 

       public void onFftDataCapture(Visualizer visualizer, 
         byte[] bytes, int samplingRate) { 
        mVisualizerView.updateVisualizer(bytes, samplingRate); 
       } 
      }, Visualizer.getMaxCaptureRate()/2, false, true); 

OnPaint()

for (int i = 0; i < mBytes.length/2; i++) { 
     mPoints[i * 4] = i * 8; 
     mPoints[i * 4 + 1] = 0; 
     mPoints[i * 4 + 2] = i * 8; 
     byte rfk = mBytes[2 * i]; 
     byte ifk = mBytes[2 * i + 1]; 
     magnitude = (float) (rfk * rfk + ifk * ifk); 
     int dbValue = (int) (10 * Math.log10(magnitude)); 
     mPoints[i * 4 + 3] = (float) (dbValue * 7); 
    }  
    canvas.drawLines(mPoints, mForePaint); 

कहाँ mVisualizer विजुअलाइज़र वर्ग वस्तु है, और mBytesonFftDataCapture घटना से FFT डेटा मिला है।

आप ईवेंट here द्वारा लौटाए गए एफएफटी डेटा के बारे में अधिक पढ़ सकते हैं।

यह वही महत्व देता रहा onFftDataCapture() मिलता है:

[90, -1, -27, 102, 13, -18, 40, 33, -7, 16, -23, -23, -2, -8, -11, -9, -8, -33, -29, 44, 4, -9, -15, -1, -2, -17, -7, 1, 1, 0, 3, -11, -5, 10, -24, -6, -23, 1, -9, -21, -2, 4, 9, -10, -14, -5, -16, 8, 6, -16, 14, 3, 7, 15, 10, -2, -15, -14, -5, 10, 8, 23, -1, -16, -2, -6, 4, 9, -1, 0, 0, 9, 1, 4, -2, 6, -6, -6, 8, -4, 6, 6, -4, -5, -5, -2, 3, 0, -1, 0, -7, 0, 2, 1, 0, 1, -1, 0, -1, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1]

किसी भी विचार, लिंक उपयोगी होगा।

Partial value drawing

full value drawing

@Chris स्ट्रैटन

अब मैं square wave at 1000 Hz फ़ाइल खेल रहा हूँ और उस की स्क्रीन शॉट ले लिया के लिए अद्यतन। अब आप क्या सुझाव देते हैं?

1 KHz spectrum

@ruhalde सुझाव

अब मैं Frequency sweep (20-20000 Hz) फ़ाइल खेल रहा हूँ और उत्पादन के बाद इस फ़ाइल उत्पन्न के बाद अपडेट किया गया।

Frequency sweep (20-20000 Hz) output

+0

क्या आप स्पेक्ट्रम को फिर से निकालने से पहले अपने कैनवास को साफ़ कर रहे हैं? मैं बस (जंगली) अनुमान लगा रहा हूं कि टूटे हुए टुकड़े पिछले ड्रॉ से बचाए गए हैं ... –

+0

मैं 'अद्यतन विज़ुअलाइज़र()' विधि में 'अवैध() 'को कॉल कर रहा हूं। यह वह काम कर रहा है। –

+0

मुझे लगता है कि आपका डीबी और परिमाण सूत्र सही नहीं हैं। पहली परिमाण की गणना एसक्यूआर (2) के साथ बहुआयामी द्वारा की जाती है। डीबी में भी आपको एक सीमा से विभाजित करने की आवश्यकता है, क्योंकि डीबी हमेशा किसी चीज़ से संबंधित उपाय होता है। आप अपनी सीमा से डाइविंग नहीं कर रहे हैं, इसलिए आपकी सीमा 1 डीबी है, यही कारण है कि आपका ग्राफ इतना अजीब है। यहां http://zone.ni.com/devzone/cda/tut/p/id/4278 – ruhalde

उत्तर

2

यह दोनों खिड़कियों संदर्भ और Android एप्लिकेशन पर जाना जाता परिमाण sinusoids खेल कर वास्तव में कैसे व्यवहार की उम्मीद से अलग है (उम्मीद है कि यही कारण है कि को समझने के लिए नेतृत्व करेंगे में) यह पता लगाने की उपयोगी हो सकता है विकास जारी है। एक समय में एक सिंथेसाइज्ड आवृत्ति का परीक्षण करें, और प्रत्येक स्क्रीन और स्पष्ट परिमाण पर प्लॉट किए जाने की स्थिति, परिमाण और विशिष्टता देखें।

उदाहरण के लिए, आप कवर आवृत्ति रेंज में मतभेदों को खोज सकते हैं, या शायद एक संस्करण रैखिक एक की बजाय एक लॉगरिदमिक अक्ष (दशकों या ऑक्टेट्स) पर आवृत्ति की साजिश कर रहा है।

यदि आपका डेटा स्रोत माइक्रोफ़ोन है, तो आप इनपुट सर्किट्री या सेटिंग्स में रोलऑफ भी ले सकते हैं।

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

+0

आपके लिए जानकारी के लिए, मुझे अपने मीडिया प्लेयर के लिए स्पेक्ट्रम की आवश्यकता है और मैं "ज्ञात परिमाण sinusoids" सुझाव का प्रयास करेंगे। –

+0

कृपया अपडेट की गई पोस्ट देखें। –

+0

मैं सुझाव देता हूं कि वर्ग तरंगों का उपयोग न करें। क्या आप जानते हैं कि वर्ग लहर की आवृत्ति स्पेक्ट्रम कैसा दिखता है? उस ने कहा, आप कुछ रोचक चीजें देख सकते हैं - तीसरे शिखर में मैंने उल्लेख किए गए आसन्न डिब्बे की समस्या के बीच ऊर्जा का विभाजन किया है। ऐसा लगता है कि आपके पास 15 केएचजेड से ऊपर की ओर एक उचित प्रतिक्रिया है, तो शायद कहीं फ़िल्टर से कुछ रोलऑफ। लगभग 10 किलोहर्ट्ज़ "छेद" दिलचस्प है। सुझाव देंगे कि आप इसे कुछ सेट करके अधिक विस्तार से एक्सप्लोर करें जहां आप साइन लहर की आवृत्ति को समायोजित कर सकते हैं, इसलिए आपके पास निरंतर इनपुट परिमाण के समय केवल एक आवृत्ति होगी। –

2

मैं अपने कोड में कुछ खामियां देखेंगे मुख्य रूप से यहां >>

Visualizer.getMaxCaptureRate()/2 

अधिकतम कब्जा दर/2 का उपयोग करने का कोई ज़रूरत नहीं है, बस एक मूल्य कहीं 10 और 30 बार के बीच प्रति सेकंड डाल (millihertz अनुसार हालांकि, 10000 और 30000 के बीच डॉक्यूमेंटेशन के लिए), यह चमकदार नहीं होने और विजुअलाइजर के अंदर संसाधनों पर बहुत अधिक दबाव डालने के लिए पर्याप्त नहीं होगा। इसके अलावा, केवल 20 और 20 किलोहर्ट्ज के बीच परिमाण के साथ ड्रा करें, यह आपके कोड में श्रव्य स्पेक्ट्रम है, आप प्रत्येक आवृत्ति को 0 और आपकी कैप्चर रेट/2 के बीच खींच रहे हैं, जो अधिकतम दर/2 है, जो जानता है कि कौन सी आवृत्ति उच्च है। ..

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

जाओ here if you want से झाडू फ़ाइलों के बजाय OnDataCaptureListener साथ यह कर ?? का), तो आपको एक और धागा चल रहा है के साथ की कोशिश की है मतदान getFft (। मैं RunNnUtiThread() विधि के साथ UI को अद्यतन करने के लिए एक रननेबल के अंदर इस दृष्टिकोण को आजमाउंगा।

+0

रेंज में एकल आवृत्ति इनपुट का परीक्षण करने की संभावना डीबगिंग की कुंजी होगी, लेकिन स्वचालित सफाई संभवतः विश्लेषण करने में मुश्किल होगी जब तक कि स्वीप पर्याप्त न हो, प्रत्येक आवृत्ति पर क्या देखा जा रहा है उसे समझने में सक्षम हो। इसके बाद समस्याग्रस्त मामलों को स्थिर इनपुट के साथ परीक्षण करने की आवश्यकता होगी। –

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