2008-09-17 10 views
10

मुझे बाइट की सरणी के रूप में संग्रहीत (vb में) नमूना की आवृत्ति को खोजने की आवश्यकता है। नमूना एक साइन लहर है, ज्ञात आवृत्ति है, इसलिए मैं जांच सकता हूं), लेकिन संख्याएं थोड़ा अजीब हैं, और मेरे गणित-फू कमजोर हैं। मूल्यों की पूरी श्रृंखला 0-255। 99% संख्याएं 235 से 245 तक हैं, लेकिन कुछ आउटलाइजर्स 0 और 1 तक नीचे हैं, और शेष 1% में 255 तक हैं। आउटलेटर्स को हटाने के लिए मैं इसे सामान्य कैसे कर सकता हूं, (235-245 अंतराल की गणना करना क्योंकि यह विभिन्न नमूनों के साथ बदल सकता है), और आवृत्ति प्राप्त करने के लिए मैं शून्य-क्रॉसिंग की गणना कैसे करूं? क्षमा करें अगर यह विवरण बकवास है!ध्वनि नमूना (संख्याओं की सरणी के रूप में) का गणितीय विश्लेषण

+0

बकवास नहीं। वास्तव में अच्छा सवाल है। – Purfideas

+0

आप शीर्षक को "संख्याओं की सरणी के रूप में" बदलना चाहते हैं –

उत्तर

6

FFT शायद सबसे अच्छा जवाब है, लेकिन अगर आप वास्तव में अपने विधि द्वारा यह करना चाहते हैं, इस प्रयास करें:

को सामान्य करने के लिए, पहले एक हिस्टोग्राम बनाने गिनती करने के लिए कितने 0 से 255 से प्रत्येक मान के occurrances । तब की तरह कुछ के साथ एक छोर से मूल्यों का एक्स प्रतिशत बाहर फेंक:

for (i=lower=0;i< N*(X/100); lower++) 
    i+=count[lower]; 
//repeat in other direction for upper 

अब

A[i] = 255*(A[i]-lower)/(upper-lower)-128 

साथ सामान्य दूर -128..127 सीमा के बाहर परिणाम फेंक।

अब आप शून्य क्रॉसिंग गिन सकते हैं। यह सुनिश्चित करने के लिए कि आप शोर से मूर्ख नहीं हैं, आप पिछले कई बिंदुओं पर ढलान का ट्रैक रखना चाहेंगे, और औसत ढलान सही तरीके से चलने पर केवल क्रॉसिंग की गणना कर सकते हैं।

3

उपयोग फूरियर को बदलने, यह बहुत अधिक शोर असंवेदनशील है शून्य क्रॉसिंग

गिनती

संपादित से: @WaveyDavey

मैं एक एफ # पुस्तकालय पाया एक FFT करने के लिए: From here

यह बदल जाता है बाहर, सबसे अच्छा मुफ्त कार्यान्वयन जो मैंने F # उपयोगकर्ताओं के लिए अभी तक पाया है अब भी शानदार FFTW लाइब्रेरी है। उनकी साइट पर प्रीकंपिल्ड विंडोज डीएलएल है। मैंने न्यूनतम बाइंडिंग्स लिखी हैं जो एफ #, से FFTW तक थ्रेड-सुरक्षित पहुंच दोनों गुरु और सरल इंटरफेस के साथ अनुमति देते हैं। प्रदर्शन उत्कृष्ट है, 32-बिट विंडोज एक्सपी प्रो केवल 64% बिट लिनक्स से 35% धीमा है।

अब मुझे यकीन है कि आप VB.net, सी # आदि, कि हमला करने के लिए इस समस्या को डेटा के एक ब्लॉक पर विचार करना है उनके डॉक्स

+0

बाइट की सरणी से वीबी में डीएफटी/एफएफटी करने के लिए नोब के लिए कोई पॉइंटर्स? –

+0

यदि दस्तावेज़ स्पष्ट नहीं हैं तो मैं सिर्फ एक प्रश्न पूछता हूं .net, "वीबी से एफ # lib कैसे कॉल करें?" – Purfideas

5

मानक विधि में होना चाहिए से एफ # lib कॉल कर सकते हैं कर रहा हूँ, उम्मीद है कि कम से कम दो बार वास्तविक आवृत्ति (अधिक डेटा लेना बुरा नहीं है, इसलिए थोड़ा अधिक अनुमान लगाना अच्छा होता है), फिर FFT लें और अनुमान लगाएं कि आवृत्ति परिणामी एफएफटी स्पेक्ट्रम में सबसे बड़ी संख्या से मेल खाती है।

वैसे, बहुत ही समान समस्याएं पहले यहां पूछी गई हैं - आप उन उत्तरों को भी खोज सकते हैं।

0

मैं "मूल एफएफटी" के लिए googled। Visual Basic FFT आपका प्रश्न एफएफटी चिल्लाता है, लेकिन एफएफटी का उपयोग करके सावधान रहें, डीएसपी के बारे में थोड़ा सा समझने के परिणाम भी उन परिणामों का नेतृत्व कर सकते हैं जिन्हें आप समझ में नहीं आते हैं या नहीं जानते कि वे कहां से आते हैं।

1

यदि मैं आपके विवरण से अच्छी तरह से समझ गया, तो आपके पास एक सिग्नल है जो एक साइन के साथ एक स्थिर प्लस कुछ यादृच्छिक glitches है। कहें,

x[n] = A*sin(f*n + phi) + B + N[n] 

जहां एन [एन] "गड़बड़" शोर है जिसे आप छुटकारा पाने के लिए चाहते हैं।

यदि ग्लिच एक-नमूना लंबा हैं, तो आप उन्हें एक औसत फ़िल्टर का उपयोग करके हटा सकते हैं जो गड़बड़ की लंबाई से बड़ा होना चाहिए। गड़बड़ी के दोनों तरफ। लंबाई 1 के ग्लिच, मतलब है कि आपके पास लंबाई के 3 नमूने के औसत के साथ पर्याप्त होगा।

y[n] = median3(x[n]) 

मंझला तो गणना की जाती है: एक्स आप फ़िल्टर करना चाहते के नमूने ले लो (एक्स [एन 1], एक्स [n], एक्स [n + 1]), उन्हें सॉर्ट, और अपने उत्पादन होता है बीच का।

अब शोर सिग्नल दूर है, निरंतर सिग्नल से छुटकारा पाएं। मैं समझता हूं कि बफर सीमित और ज्ञात लंबाई का है, इसलिए आप पूरे बफर के अर्थ की गणना कर सकते हैं। इसे सार

अब आपके एकल साइनस सिग्नल है। अब आप शून्य क्रॉसिंग की गणना करके मौलिक आवृत्ति की गणना कर सकते हैं। 0 से ऊपर के नमूने की मात्रा की गणना करें जिसमें पूर्व नमूना 0 से नीचे था। अवधि आपके बफर के नमूने की कुल मात्रा है, और आवृत्ति अवधि के oposite (1/x) है।

1

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

Fityk का उपयोग करके, आप डेटा लोड कर सकते हैं, और a*sin(b*x-c) पर फिट कर सकते हैं जहां 2*pi/b आपको फिटिंग के बाद आवृत्ति देगा।

स्क्रिप्टिंग के लिए कमांड लाइन से Fityk का उपयोग गुई से किया जा सकता है और इसमें सी ++ एपीआई है ताकि इसे सीधे आपके प्रोग्राम में शामिल किया जा सके।

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