/ / C का एक परिमाणीकरण कार्य है? - सी, परिमाणीकरण

C में एक परिमाणीकरण कार्य है? - सी, परिमाणीकरण

मेरे पास कई सकारात्मक 16 बिट मूल्यों (जो डबल्स के रूप में संग्रहीत हैं) के साथ एक बफर है जिसे मैं 8 बिट (0-255 मान) निर्धारित करना चाहता हूं।

इसके अनुसार विकिपीडिया प्रक्रिया यह होगी:

  • 16 बिट मान को सामान्य करें। अर्थात। इसके साथ सबसे बड़ा और विभाजित करें।
  • M = 8 के साथ Q (x) सूत्र का उपयोग करें।

तो मुझे आश्चर्य है, अगर सी में एक फ़ंक्शन है जो इस मात्रा का ठहराव कर सकता है, या क्या किसी को सी कार्यान्वयन का पता है जो मैं उपयोग कर सकता हूं?

ढेर सारा प्यार, लुईस

उत्तर:

जवाब के लिए 2 № 1

मान मानना d अंतराल में है [0.0, max]:

unsigned char quantize(double d, double max)
{
return (unsigned char)((d / max) * 255.0);
}

मुझे यकीन नहीं है कि "16-बिट मान" से आपका क्या मतलब है?IEEE-754 का उपयोग करके किसी भी प्रणाली पर दोहरे सटीक मान 64-बिट हैं। हालाँकि, यदि आपके पास किसी अन्य संख्यात्मक प्रकार के मान हैं, तो प्रक्रिया प्रभावी रूप से समान है।


जवाब के लिए 3 № 2

यह तरंग ऑडियो प्रसंस्करण जैसा लगता है, जहां आपका इनपुट 16 पीसीएम डेटा है, आपका आउटपुट 8 बिट पीसीएम डेटा है और आप एक मध्यवर्ती मूल्य के रूप में डबल्स का उपयोग कर रहे हैं।

हालांकि, 8 बिट पीसीएम लहर डेटा केवल मात्रा निर्धारित नहीं है, प्रतिनिधित्व 128 से अधिक संकेतन में अहस्ताक्षरित मान है। (जैसे कि घातांक फ्लोटिंग पॉइंट नंबरों में संचित होते हैं)

सबसे बड़ा मूल्य पहले खोजना न केवल मात्रात्मक होगा, बल्कि स्केलिंग भी होगा। इसलिए छद्म कोड में

double dMax = max_of_all_values(); //
...
foreach (dValue in array_of_doubles)
{
signed char bValue = (signed char)((dValue / dMax)*127.0);
}

यदि आप रौंदने के बजाय गोल कर सकते हैंअधिक सटीकता चाहते हैं, लेकिन ऑडियो प्रोसेसिंग में, यह आमतौर पर ट्रंकेशन ऑर्डर को रैंडम करने के लिए बेहतर है या यहां तक ​​कि अनिवार्य रूप से डुप्लिकेट से चार्ट किए गए चार्ट में ट्रंकेशन के हिस्से के रूप में फ़िल्टरिंग एल्गोरिदम को चलाकर।

ध्यान दें: यदि आउटपुट 8 बिट पीसीएम डेटा है, तो हस्ताक्षरित चार्ट सही नहीं है, लेकिन चूंकि प्रश्न विशेष रूप से अनुरोध नहीं करता है, इसलिए मैंने इसे छोड़ दिया।

संपादित करें:यदि इसे पिक्सेल डेटा के रूप में उपयोग किया जाना है, तो आप अहस्ताक्षरित मान चाहते हैं। मुझे लगता है कि जेम्स पहले ही अहस्ताक्षरित मूल्यों के लिए सही जवाब दे चुका है जब इनपुट अहस्ताक्षरित है (सामान्यीकृत डेटा से dB मान वास्तव में सभी होने चाहिए)


उत्तर № 3 के लिए 1

यह आपके प्रश्न से स्पष्ट नहीं है कि एन्कोडिंग क्या है "सकारात्मक 16 बिट मान"कोई वास्तविक समझ नहीं है; वे या तो 16 बिट हैं या वे डबल हैं, वे दोनों नहीं हो सकते हैं।

हालाँकि यह मानते हुए कि यह १६ बिट अहस्ताक्षरित डेटा १.० के लिए सामान्यीकृत है (इसलिए मान ०.० <= से लेकर है रों <= 1.0), फिर आपको उन्हें 8bit पूर्णांक मानों तक विस्तारित करने के लिए प्रत्येक नमूने को 255 से गुणा करना होगा।

unsigned char s8 = s * 255 ;

यदि रेंज 0.0 <= नहीं है रों <= 1.0, लेकिन 0.0 <= s <= अधिकतम फिर:

unsigned char s8 = s / max * 255 ;

किसी भी तरह से, "परिमाण" फ़ंक्शन नहीं हैएक के अलावा आप खुद लिख सकते हैं; लेकिन आवश्यक परिवर्तन कोई संदेह नहीं है एक सरल अंकगणितीय अभिव्यक्ति होगी (हालांकि इतना आसान नहीं है अगर डेटा शायद ही बनाया गया है - यानी μ-lay या A- कानून उदाहरण के लिए एन्कोडेड)।