2009-03-11 17 views
32

मैं समय श्रृंखला की शक्ति वर्णक्रमीय घनत्व की गणना करना चाहता हूं; कुछ बैंडपास, लोपास, और हाईपास फ़िल्टरिंग करें; शायद कुछ अन्य बुनियादी सामान।जावा में सिग्नल प्रोसेसिंग लाइब्रेरी?

क्या ऐसा करने के लिए एक अच्छी ओपन-सोर्स जावा लाइब्रेरी है?

मैंने बिना सफलता के थोड़ा सा शिकार किया है (उदाहरण के लिए, गूगलिंग "पावर स्पेक्ट्रल घनत्व जावा" या "सिग्नल प्रोसेसिंग जावा" और लिंक के माध्यम से क्लिक करना, अपाचे कॉमन्स, सोर्सफोर्ज, जावावार्ट इत्यादि में देखकर)।

बहुत सारे एप्लेट, किताबें, ट्यूटोरियल, वाणिज्यिक उत्पाद इत्यादि हैं, जो मेरी ज़रूरतों को पूरा नहीं करते हैं।

अद्यतन: मैंने पाया फूरियर के लिए org.apache.commons.math.transform बदल देती है। यह बिजली वर्णक्रमीय घनत्व, बैंडपास, आदि लागू नहीं करता है, लेकिन यह कुछ है।

+1

किसी को भी सी/सी के लिए किसी भी इसी तरह पुस्तकालयों की जान लेता है कि ++? – devin

+1

fftw, http://www.fftw.org/ – basszero

+1

सबसे पहले, यह प्रश्न जावा के बारे में है, सी नहीं। :) दूसरा, एफएफटीडब्ल्यू ऐसा लगता है कि इसमें एफएफटी है। बैंडपास, लोपास, हाईपास फ़िल्टरिंग, पावर स्पेक्ट्रल घनत्व, आदि के बारे में क्या? स्पष्ट रूप से एफएफटी आधार बनाता है, लेकिन उन परिचालनों के लिए उच्च स्तरीय इंटरफ़ेस नहीं है। – dfrankow

उत्तर

3

यह बहुत अस्पष्ट दिखता है। Signalgo या jein या Intel Signal Processing Library आज़माएं, हालांकि मुझे लगता है कि आखिरी वाला सिर्फ एक जेएनआई रैपर है।

मैंने उन ऐपलेट्स को देखा जो आप बात कर रहे थे। मुझे लगता है कि आप उनके लिए जेएआर प्राप्त कर सकते हैं और कक्षा एपीआई का उपयोग कर सकते हैं। दस्तावेज की कमी के कारण, हालांकि, वे क्या कर सकते हैं, यह समझने के लिए ग्रहण और जाद का उपयोग करने के लिए ग्रहण और जाद का उपयोग करना पड़ सकता है। उदाहरण के लिए this page पर स्रोत का प्रयास करें।

+0

रेफरी के लिए धन्यवाद। ईमानदारी से, मैं उनकी सराहना करता हूं। सिग्नलगो "अल्फा (यानी बिल्कुल परीक्षण नहीं किया गया है)" जिन के पास कोई स्रोत कोड नहीं है जो मुझे मिल सकता है। इंटेल ओपन सोर्स नहीं होगा। – dfrankow

8

मुझे पुस्तक Java Digital Signal Processing और इसकी example source code मिली। आप यह देखने के लिए कोड देख सकते हैं कि यह आपकी आवश्यकताओं के अनुरूप है या नहीं।

आप DSP Laboratory भी देख सकते हैं।

टिप्पणियों में उल्लिखित डफिमो और बास्सेरो के रूप में, जावा डीएसपी के प्रकाशन के बाद जावा में बदलाव हुए हैं जो कुछ कोड उदाहरणों को प्रभावित कर सकते हैं। विशेष रूप से, (अपेक्षाकृत) नया Concurrency Utilties package उपयोगी साबित हो सकता है।

+0

वाह, यह पुस्तक विंटेज 1997 है। मुझे यकीन नहीं है कि मैं इसकी अनुशंसा करता हूं। सिग्नल प्रोसेसिंग विचारों में बदलाव नहीं हुआ है, लेकिन जावा निश्चित है। – duffymo

+0

क्या परिवर्तन किए गए हैं जो आपको लगता है कि डिजिटल सिग्नल प्रोसेसिंग पर असर पड़ेगा? –

+0

@ डफिमो: तब से जावा में केवल अग्रिम कुछ समवर्ती प्राइमेटिव्स (मल्टीथ्रेडिंग के लिए डीएसपी बीईजीएस के बाद से) है। आम तौर पर डीएसपी आदिम सरणी पर गणित है। मैं डब्ल्यू/बिल हूँ। – basszero

2

मुझे एक और संसाधन मिला, हालांकि यह पुस्तकालय नहीं है: http://www.dickbaldwin.com/tocdsp.htm। कुछ जावा उदाहरणों के साथ, सिग्नल प्रोसेसिंग और फूरियर ट्रांसफॉर्म की यह एक बुनियादी चर्चा है। उदाहरण के लिए ट्यूटोरियल 1478, 1482, 1486 देखें। सुनिश्चित नहीं है कि कोड पर लाइसेंस क्या है।

21

मेरा पहला सुझाव जावा में अपना डीएसपी कार्यान्वयन नहीं करना है। मेरा दूसरा सुझाव जावा में अपने स्वयं के साधारण डीएसपी कार्यान्वयन को रोल करना होगा।


जावा का उपयोग क्यों नहीं करने के लिए:

मैं पिछले 10 वर्ष से अधिक डीएसपी कोड लिखने अनुभव के बहुत सारे है ... और लगभग डीएसपी कोड में से कोई भी जावा में है ... तो मुझे माफ कर दो जब मैं जावा में डीएसपी को कार्यान्वित करना चाहता हूं तो किसी के बारे में पढ़ने में संकोच नहीं करता।

यदि आप गैर-तुच्छ डीएसपी कर रहे हैं तो आपको जावा का उपयोग नहीं करना चाहिए। जावा में लागू करने के लिए डीएसपी इतना दर्दनाक है क्योंकि सभी अच्छे डीएसपी कार्यान्वयन निम्न स्तर की मेमोरी प्रबंधन चाल, पॉइंटर्स (पॉइंटर्स की पागल मात्रा), बड़े कच्चे डेटा सरणी आदि का उपयोग करते हैं।

जावा का उपयोग क्यों:

तुम क्या कर रहे हैं, तो सरल डीएसपी सामान अपने खुद के जावा कार्यान्वयन रोल। PSD और फ़िल्टरिंग जैसी सरल डीएसपी चीजें दोनों कार्यान्वित करने के लिए अपेक्षाकृत आसान हैं (आसान कार्यान्वयन लेकिन वे तेज़ नहीं होंगे) क्योंकि बहुत से कार्यान्वयन उदाहरण और अच्छी तरह से प्रलेखित सिद्धांत ऑनलाइन हैं।

मेरे मामले में मैंने एक बार जावा में एक PSD फ़ंक्शन लागू किया क्योंकि मैं जावा जीयूआई में PSD को ग्राफ़ कर रहा था, इसलिए जावा में प्रदर्शन हिट करना आसान था और जावा जीयूआई में PSD की गणना की गई और फिर इसे प्लॉट करें ।


एक PSD लागू करना सीखें:

PSD आम तौर पर सिर्फ FFT डीबी में दिखाया गया है की भयावहता है। अकादमिक, वाणिज्यिक और खुले स्रोत से कई उदाहरण हैं जो दिखाते हैं कि डीबी में एफएफटी की परिमाण की गणना कैसे करें। उदाहरण के लिए Apache has a Java implementation that gives you the FFT आउटपुट और फिर आपको केवल परिमाण और डीबी में कनवर्ट करने की आवश्यकता है। एफएफटी के बाद जो कुछ भी आपको चाहिए/उसके अनुरूप बनाया जाना चाहिए।


लोपास, बैंडपास छानने लागू करना सीखें:

सबसे आसान कार्यान्वयन (नहीं सबसे computationally कुशल) मेरी राय में एक प्राथमिकी फिल्टर का उपयोग कर दिया जाएगा और कर समय डोमेन घुमाव।

कनवॉल्यूशन लागू करना बहुत आसान है, यह दो लूप के लिए घोंसला है और नेट पर सचमुच लाखों उदाहरण कोड हैं।

यदि आप फ़िल्टर डिज़ाइन के बारे में कुछ नहीं जानते हैं तो एफआईआर फ़िल्टर मुश्किल हिस्सा होगा। आपके एफआईआर फ़िल्टर उत्पन्न करने के लिए मैटलैब का उपयोग करना सबसे आसान तरीका होगा और फिर गुणांक को जावा में कॉपी करें। मैं Matlab से firpmord() और firpm() का उपयोग करने का सुझाव देते हैं। स्टॉपबैंड में -30 से -50 डीबी क्षीणन और पासबैंड में 3 डीबी लहर के लिए शूट करें।

+6

मैं अब इस पर काम नहीं कर रहा हूं, लेकिन वाणिज्यिक ऐप के लिए न्यूमेरिकल व्यंजनों से शुरू करना उचित नहीं होगा। अपाचे कॉमन्स मैथ में एक एफएफटी है: http://commons.apache.org/math/userguide/transform.html। – dfrankow

+1

@dfrankow https://github.com/JorenSix/TarsosDSP एक बेहतर शुरुआत – kervin

+0

होना चाहिए मैं इस बयान पर सोच रहा हूं कि "जावा में ऐसा न करें"। जावा में किसी भी मेमोरी प्रबंधन कार्य को संभालने का एक शानदार तरीका है, जिसमें आश्चर्यजनक तेज़ मेमोरी मैप की गई फ़ाइलें शामिल हैं। हालांकि जावा स्वयं कच्चे पॉइंटर्स का उपयोग करने के लिए संभव नहीं है, यह आपको मेमोरी बफर प्रबंधित करने के लिए सभी उच्च स्तर और सुरक्षित संरचना प्रदान करता है। ट्रिविली, एक सरल सरणी को गोलाकार बफर के रूप में उपयोग किया जा सकता है। मैसी पॉइंटर अंकगणित का उपयोग करने के बजाय, वास्तव में स्मृति में संग्रहीत कहां से संग्रहीत करने के बजाय सरणी के तत्व तक पहुंच। –

9

मैंने कुछ जावा डीएसपी कक्षाओं का संग्रह लिखा है, उदाहरण के लिए IIR फिल्टर:

Java DSP collection

+0

हालांकि उदाहरण कम से कम हैं, एपीआई बहुत लचीला प्रतीत होता है। धन्यवाद! – Charlie

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