2009-10-22 15 views
14

में डेटा संग्रहीत करने के लिए हल्के संपीड़न एल्गोरिथ्म मैं एक ATmega168/ATmega328 माइक्रोकंट्रोलर के साथ मेरे Arduino पर डेटा की एक बड़ी राशि संग्रहीत करना चाहते हैं, लेकिन दुर्भाग्य से वहाँ EEPROM भंडारण के केवल 256   KB/512   KB।Arduino: EEPROM

मेरा विचार आकार को पट्टी करने के लिए संपीड़न एल्गोरिदम का उपयोग करना है। लेकिन अच्छी तरह से, संपीड़न एल्गोरिदम पर मेरा ज्ञान काफी कम है और उपयोग में आसान पुस्तकालयों की मेरी खोज विफल रही है।

तो, क्या स्टोरेज आकार को अनुकूलित करने का कोई अच्छा तरीका है?

+1

256 EEPROM के KB? //www.atmel: [ATmega168 के लिए Atmel पेज] (http://www.atmel.com/devices/atmega168.aspx) के अनुसार यह EEPROM के 512 बाइट्स (हाँ, बाइट्स) और [ATmega328] (http है। कॉम/डिवाइस/atmega328.aspx) में ईईपीरोम के 1024 बाइट हैं। क्या यह माइक्रोकंट्रोलर के लिए बाहरी है EEPROM? –

उत्तर

13

आप LZO एल्गोरिदम पर एक नज़र डाल सकते हैं, जिसे हल्के वजन के लिए डिज़ाइन किया गया है। मुझे नहीं पता कि एवीआर सिस्टम के लिए कोई कार्यान्वयन है या नहीं, लेकिन ऐसा कुछ हो सकता है जिसे आप स्वयं लागू कर सकते हैं।

यद्यपि आप अपने चिप पर ईईपीरोम में उपलब्ध स्टोरेज की मात्रा के बारे में कुछ हद तक गलत जानकारी दे सकते हैं; डेटापत्रक मैं के अनुसार EEPROM आकार हैं:

ATmega48P: 256
ATmega88P: 512
ATmega168P: 512
ATmega256P: 1024

ध्यान दें कि उन मूल्यों बाइट्स, के रूप में KB नहीं हैं आप अपने प्रश्न में उल्लेख करते हैं। यह किसी भी उपाय से नहीं, एक "shitload" है।

+2

LZO जाहिरा तौर पर की जरूरत है संपीड़न के दौरान स्मृति के 8 या 64 KB, जो इन प्रोसेसर – fvu

+0

मैं यह क्या अनुप्रयोग है पर निर्भर करता है लगता है पर एक समस्या हो सकता है; प्रश्न यह नहीं बताता है कि डेटा Arduino द्वारा संपीड़ित किया जाएगा, या किसी और द्वारा संपीड़ित किया जाएगा और Arduino द्वारा * decompressed *। मैंने डिकंप्रेशन केस ग्रहण किया था। –

+0

आपके सुझाव के लिए धन्यवाद। क्षमा करें, सच है, मैंने ईईपीरोम आकार को मिश्रित किया है, ग्रेग सही है। वास्तव में वास्तव में मुझे केवल डिकंप्रेशन भाग की आवश्यकता है। अच्छा मैं इसे आज़मा दूंगा .. – RngTng

3

A NASA study here (पोस्टस्क्रिप्ट)

A repost of 1989 article on LZW here

इसे आसान बनाएं और संपीड़न जोड़ने की लागत/भुगतान का विश्लेषण करते हैं। इसमें समय और प्रयास, जटिलता, संसाधन उपयोग, डेटा संपीड़न आदि शामिल हैं।

7

एवीआर में केवल कुछ किलोबाइट ईईपीरोम हैं, और बहुत कम में 64K फ्लैश (कोई मानक Arduinos नहीं) से अधिक है।

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

कुछ और यादृच्छिक संपीड़न, उदाहरण के लिए लॉग डेटा, ऑडियो इत्यादि, एवीआर के लिए जबरदस्त ओवरहेड ले लेंगे, आपको इस डेटा को पकड़ने के लिए एक सीरियल ईईपीरोम चिप प्राप्त करने में बेहतर भाग्य होगा। Arduino की साइट पर interfacing with a 64K chip पर एक पृष्ठ है, जो लगता है। यदि आप उससे अधिक चाहते हैं, तो एसपीआई के साथ एसडी कार्ड के साथ इंटरफेसिंग देखें, उदाहरण के लिए this audio shield

3

LZSS जैसे कुछ एल्गोरिदम शायद एम्बेडेड प्लेटफॉर्म के लिए एक अच्छा विकल्प होगा। वे सरल एल्गोरिदम हैं, और अधिक स्मृति की आवश्यकता नहीं है।

LZS वह है जिसे मैं परिचित हूं। यह संपीड़न और डिकंप्रेशन के लिए 2 केबी शब्दकोश का उपयोग करता है (शब्दकोश असम्पीडित डेटा स्ट्रीम का सबसे हालिया 2 केबी है)। (LZS was patented by HiFn, तथापि जहाँ तक मैं बता सकता हूँ, सभी पेटेंट की अवधि समाप्त हो।)

लेकिन मैं देख रहा हूँ एक ATmega328, हाल ही में Arduinos पर इस्तेमाल किया, केवल 2 kB SRAM के लिए 512 बाइट्स है, इसलिए भी हो सकता है LZS लिए बहुत बड़ा है यह।मुझे यकीन है कि आप एक छोटे से शब्दकोश के साथ एक संस्करण का उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि आप क्या संपीड़न अनुपात प्राप्त करेंगे।

1

आप LZJB पर भी बहुत कम, सरल और हल्के वजन को देखना चाहते हैं।

इसके अलावा, FastLZ एक लायक हो सकता है। यह एलजेजेजेबी की तुलना में बेहतर संपीड़न अनुपात प्राप्त करता है और इसमें डिकंप्रेशन के लिए बहुत कम स्मृति आवश्यकताएं होती हैं:

1

पेपर "डेले टोलरेंट नेटवर्क में ऊर्जा-सीमित उपकरणों के लिए डेटा संपीड़न एल्गोरिदम" में वर्णित विधि ATmega328 पर चल सकती है।

संदर्भ: C. Sadler और एम Martonosi, "देरी सहिष्णु नेटवर्क में ऊर्जा विवश उपकरणों के लिए डेटा संपीड़न एल्गोरिदम," पर एंबेडेड नेटवर्क सेंसर सिस्टम (SENSYS) 2006, नवम्बर 2006 .pdf एसीएम सम्मेलन की कार्यवाही। एमएसपीजीसीसी के लिए एस-एलजेडब्लू स्रोत: slzw.tar.gz. अपडेट किया गया 10 मार्च 2007

0

तुम सिर्फ कुछ दोहरा शून्य के दूर करने के लिए या इस तरह के, Run-length encoding दोहराए जाने बाइट दृश्यों उपयोग करना चाहते हैं संग्रहीत किया जाएगा के रूप में:

<mark><byte><count> 

यह सुपर सरल एल्गोरिथ्म, जो आप शायद कोड कर सकते हैं है कोड की कुछ पंक्तियों में खुद को।

0

क्या बाहरी ईईपीरोम (उदाहरण के लिए I2C के माध्यम से) एक विकल्प नहीं है? भले ही आप एक संपीड़न एल्गोरिदम का उपयोग करते हैं, नीचे की ओर यह है कि आंतरिक ईईपीरोम में आपके द्वारा संग्रहीत डेटा का आकार किसी भी सरल तरीके से निर्धारित नहीं किया जा सकता है .. और यदि आप वास्तव में केबीईटीईएस का मतलब रखते हैं, तो एसडीकार्ड पर विचार करें एसपीआई से जुड़ा हुआ ... नेट में कुछ हल्के भारित ओपन सोर्स एफएटी-संगत फाइल सिस्टम हैं।