वाइब्रेशन वेवफ़ॉर्म का विश्लेषण करना

इस दस्तावेज़ में, Android डिवाइसों पर इस्तेमाल होने वाले सामान्य वाइब्रेशन ऐक्चुएटर के तौर पर लीनियर रेज़ोनेंट ऐक्चुएटर (एलआरए) के बारे में बताया गया है. इसमें एलआरए की विशेषताओं, हैप्टिक फ़ीडबैक जनरेट करने के तरीके, और Android API का इस्तेमाल करके असरदार हैप्टिक पैटर्न बनाने के तरीके के बारे में जानकारी दी गई है. keywords_public: > Android हैप्टिक, हैप्टिक ऐक्चुएटर, लीनियर रेज़ोनेंट ऐक्चुएटर, एलआरए, वाइब्रेशन, हैप्टिक फ़ीडबैक, VibratorFrequencyProfile, VibrationEffect, Android UI

Android डिवाइसों पर, आम तौर पर इस्तेमाल किए जाने वाले वाइब्रेशन ऐक्चुएटर, लीनियर रेज़ोनेंट ऐक्चुएटर (एलआरए) होते हैं. एलआरए, कांच की ऐसी सतह पर बटन क्लिक करने जैसा अनुभव देते हैं जो आम तौर पर काम नहीं करती. क्लिक का साफ़ और सटीक फ़ीडबैक सिग्नल आम तौर पर 10 से 20 मिलीसेकंड तक रहता है. इस एहसास से, उपयोगकर्ता के इंटरैक्शन ज़्यादा नैचुरल लगते हैं. वर्चुअल कीबोर्ड के लिए, क्लिक से जुड़ी इस जानकारी से टाइपिंग की स्पीड बढ़ सकती है और गड़बड़ियां कम हो सकती हैं.

एलआरए में कुछ सामान्य रेज़ोनेंट फ़्रीक्वेंसी होती हैं:

  • कुछ एलआरए की रेज़ोनेंट फ़्रीक्वेंसी, 200 से 300 हर्ट्ज़ की रेंज में थी. यह फ़्रीक्वेंसी, उस फ़्रीक्वेंसी से मेल खाती है जिस पर इंसानी त्वचा वाइब्रेशन के लिए सबसे ज़्यादा संवेदनशील होती है. इस फ़्रीक्वेंसी रेंज में वाइब्रेशन को आम तौर पर, स्मूद, तेज़, और अंदर तक महसूस होने वाला बताया जाता है.
  • एलआरए के अन्य मॉडल की रेज़ोनेंस फ़्रीक्वेंसी कम होती है. यह करीब 150 हर्ट्ज़ होती है. इससे मिलने वाली संवेदना, क्वालिटी के हिसाब से ज़्यादा स्मूद और डाइमेंशन के हिसाब से ज़्यादा बेहतर होती है.
इन कॉम्पोनेंट में, ऊपर से नीचे की ओर, कवर, प्लेट, बीच वाला मैग्नेट, दो साइड मैग्नेट, मास, दो स्प्रिंग, कॉइल, फ़्लेक्सिबल सर्किट, बेस, और एडहेसिव शामिल हैं.
लीनियर रेज़ोनेंट ऐक्चुएटर (एलआरए) के कॉम्पोनेंट.

दो अलग-अलग फ़्रीक्वेंसी पर एक ही इनपुट वोल्टेज देने पर, वाइब्रेशन आउटपुट के ऐम्प्लिट्यूड अलग-अलग हो सकते हैं. फ़्रीक्वेंसी, एलआरए की रेज़ोनेंट फ़्रीक्वेंसी से जितनी दूर होगी, वाइब्रेशन का ऐम्प्लिट्यूड उतना ही कम होगा.

किसी डिवाइस पर हैप्टिक इफ़ेक्ट के लिए, वाइब्रेशन ऐक्चुएटर और उसके ड्राइवर, दोनों का इस्तेमाल किया जाता है. ओवरड्राइव और ऐक्टिव ब्रेकिंग की सुविधाओं वाले हैप्टिक ड्राइवर, एलआरए के राइज़ टाइम और रिंगिंग को कम कर सकते हैं. इससे वाइब्रेशन ज़्यादा रिस्पॉन्सिव और साफ़ होता है.

वाइब्रेटर के आउटपुट की स्पीड

फ़्रीक्वेंसी-टू-आउटपुट-ऐक्सलरेशन मैपिंग (एफ़ओएएम) से, किसी वाइब्रेशन फ़्रीक्वेंसी (हर्ट्ज़ में) पर हासिल किए जा सकने वाले ज़्यादा से ज़्यादा आउटपुट ऐक्सलरेशन (जी पीक में) के बारे में पता चलता है. Android 16 (एपीआई लेवल 36) से, प्लैटफ़ॉर्म इस मैपिंग के लिए VibratorFrequencyProfile के ज़रिए, पहले से मौजूद सहायता उपलब्ध कराता है. हैप्टिक इफ़ेक्ट बनाने के लिए, इस क्लास के साथ-साथ basic और advanced एनवलप एपीआई का इस्तेमाल किया जा सकता है.

ज़्यादातर एलआरए मोटर के फ़ोएम में एक ही पीक होता है. आम तौर पर, यह पीक उनकी रेज़ोनेंट फ़्रीक्वेंसी के आस-पास होता है. आम तौर पर, फ़्रीक्वेंसी इस रेंज से अलग होने पर, ऐक्सलरेशन तेज़ी से कम होता है. ऐसा हो सकता है कि कर्व सिमेट्रिकल न हो. साथ ही, मोटर को खराब होने से बचाने के लिए, रेज़ोनेंट फ़्रीक्वेंसी के आस-पास एक प्लैटो मौजूद हो सकता है.

साथ वाले प्लॉट में, एलआरए मोटर के लिए फ़ोम का उदाहरण दिखाया गया है.

फ़्रीक्वेंसी के 120 हर्ट्ज़ तक बढ़ने पर, ऐक्सलरेशन बहुत तेज़ी से बढ़ता है. इसके बाद, ऐक्सलरेशन 180 हर्ट्ज़ तक स्थिर रहता है. इसके बाद, यह कम हो जाता है.
एलआरए मोटर के लिए फ़ोम का उदाहरण.

इंसानी गतिविधियों का पता लगाने के लिए थ्रेशोल्ड

कंपन का पता लगाने के लिए, इंसानों के हिसाब से तय किया गया थ्रेशोल्ड का मतलब है कि कंपन की वह कम से कम गति जिसे कोई व्यक्ति आसानी से महसूस कर सकता है. वाइब्रेशन की फ़्रीक्वेंसी के आधार पर, यह लेवल अलग-अलग होता है.

साथ में दिया गया प्लॉट, समय के हिसाब से फ़्रीक्वेंसी के फ़ंक्शन के तौर पर, ऐक्सलरेशन में इंसानों के हैप्टिक परसेप्शन का पता लगाने के थ्रेशोल्ड को दिखाता है. थ्रेशोल्ड डेटा को बोलानोवस्की जूनियर के फ़िगर 1 में दिए गए डिसप्लेसमेंट थ्रेशोल्ड से बदला गया है, एस॰ जे. और अन्य लोगों के 1988 के लेख, "Four channels mediate the mechanical aspects of touch.".

Android, इस थ्रेशोल्ड को BasicEnvelopeBuilder में अपने-आप मैनेज करता है. इससे यह पुष्टि होती है कि सभी इफ़ेक्ट, फ़्रीक्वेंसी की ऐसी रेंज का इस्तेमाल करते हैं जिससे वाइब्रेशन एंप्लीट्यूड मिलते हैं. ये एंप्लीट्यूड, इंसानों के महसूस करने की क्षमता के थ्रेशोल्ड से कम से कम 10 डीबी ज़्यादा होते हैं.

फ़्रीक्वेंसी के 20 हर्ट्ज़ तक बढ़ने पर, इंसान के सुनने की थ्रेशोल्ड वैल्यू, लॉगरिथम के हिसाब से बढ़कर -35 dB हो जाती है. थ्रेशोल्ड, 200 हर्ट्ज़ तक स्थिर रहता है. इसके बाद, यह -20 डीबी तक लगभग रैखिक रूप से बढ़ता है.
हैप्टिक परसेप्शन का पता लगाने के लिए थ्रेशोल्ड.

ऑनलाइन ट्यूटोरियल में, ऐक्सलरेशन ऐम्प्लिट्यूड और डिसप्लेसमेंट ऐम्प्लिट्यूड के बीच कन्वर्ज़न के बारे में ज़्यादा जानकारी दी गई है.

वाइब्रेशन के ऐक्सलरेशन लेवल

वाइब्रेशन की इंटेंसिटी को इंसान किस तरह महसूस करता है, यह परसेप्शन का मेज़रमेंट है. यह वाइब्रेशन के ऐम्प्लिट्यूड के साथ रैखिक रूप से नहीं बढ़ता है. वाइब्रेशन का ऐम्प्लिट्यूड, फ़िज़िकल पैरामीटर है. आवाज़ की तीव्रता को सुनने की क्षमता (एसएल) के हिसाब से तय किया जाता है. इसे एक ही फ़्रीक्वेंसी पर, पहचान के थ्रेशोल्ड से ज़्यादा डेसिबल (डीबी) के तौर पर तय किया जाता है.

इसके हिसाब से, वाइब्रेशन ऐक्सलरेशन ऐम्प्लिट्यूड (G पीक में) की गिनती इस तरह की जा सकती है:

$$ Amplitude(G) = 10^{Amplitude(db)/20} $$

...जहां ऐम्प्लिट्यूड डीबी, एसएल और पता लगाने के थ्रेशोल्ड का योग होता है. यह वैल्यू, किसी खास फ़्रीक्वेंसी पर आस-पास के प्लॉट में वर्टिकल ऐक्सिस के साथ होती है.

साथ वाले प्लॉट में, 10, 20, 30, 40, और 50 डीबी एसएल पर वाइब्रेशन ऐक्सलरेशन लेवल दिखाए गए हैं. साथ ही, इसमें समय के हिसाब से फ़्रीक्वेंसी के फ़ंक्शन के तौर पर, इंसानों के हैप्टिक परसेप्शन का पता लगाने की थ्रेशोल्ड (0 डीबी एसएल) भी दिखाया गया है. यह डेटा, Verrillo, R. के फ़िगर 8 से अनुमानित किया गया है. टी. और अन्य लोगों के 1969 के लेख, "वाइब्रेट करने वाले स्टिमुलस की संवेदना की तीव्रता.".

सेंसेशन लेवल बढ़ने पर, डेसिबल में ज़रूरी ऐक्सलरेशन भी लगभग उतना ही बढ़ जाता है. उदाहरण के लिए, 100 हर्ट्ज़ की कंपन के लिए 10 डीबी
       सेंसेशन लेवल, -30 डीबी के बजाय -20 डीबी होता है.
वाइब्रेशन की स्पीड के लेवल.

Android, BasicEnvelopeBuilder में इस कन्वर्ज़न को अपने-आप मैनेज करता है. यह संसेशन लेवल स्पेस (dB SL) में सामान्य की गई इंटेंसिटी के तौर पर वैल्यू लेता है और उन्हें आउटपुट ऐक्सलरेशन में बदलता है. दूसरी ओर, WaveformEnvelopeBuilder इस कन्वर्ज़न को लागू नहीं करता है. इसके बजाय, यह ऐक्सलरेशन स्पेस (Gs) में, ऐक्सलरेशन के ऐम्प्लिट्यूड के सामान्य किए गए आउटपुट के तौर पर वैल्यू लेता है. Envelope API यह मानता है कि जब कोई डिज़ाइनर या डेवलपर वाइब्रेशन की तीव्रता में बदलाव करने के बारे में सोचता है, तो वह चाहता है कि तीव्रता में बदलाव, एक लीनियर एनवलप के हिसाब से हो.

डिवाइसों पर डिफ़ॉल्ट रूप से वेवफ़ॉर्म को स्मूद करने की सुविधा

उदाहरण के लिए, देखें कि सामान्य डिवाइस पर कस्टम वेवफ़ॉर्म पैटर्न कैसे काम करता है:

Kotlin

val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

यहां दिए गए प्लॉट में, इनपुट वेवफ़ॉर्म और ऊपर दिए गए कोड स्निपेट के हिसाब से आउटपुट ऐक्सलरेशन दिखाया गया है. ध्यान दें कि पैटर्न में ऐम्प्लिट्यूड में बदलाव होने पर, ऐक्सलरेशन अचानक नहीं, बल्कि धीरे-धीरे बढ़ता है. ऐसा 0 मि॰से॰, 150 मि॰से॰, 200 मि॰से॰, 250 मि॰से॰, और 700 मि॰से॰ पर होता है. इसके अलावा, ऐम्प्लिट्यूड में हर बदलाव के दौरान ओवरशूट होता है. साथ ही, इनपुट ऐम्प्लिट्यूड के अचानक 0 पर गिरने पर, कम से कम 50 मि॰से॰ तक रिंगिंग होती है.

स्टेप फ़ंक्शन के इनपुट वेवफ़ॉर्म का प्लॉट.
मापे गए असल वेवफ़ॉर्म का प्लॉट, जिसमें लेवल के बीच ज़्यादा ऑर्गैनिक ट्रांज़िशन दिख रहे हैं.

बेहतर हैप्टिक पैटर्न

ओवरशूट से बचने और रिंगिंग टाइम को कम करने के लिए, ऐम्प्लिट्यूड को ज़्यादा धीरे-धीरे बदलें. यहां, संशोधित वर्शन के वेवफ़ॉर्म और ऐक्सलरेशन प्लॉट दिखाए गए हैं:

Kotlin

val timings: LongArray = longArrayOf(
    25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
    300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
    38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
    0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] {
        25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
        300, 25, 25, 150, 25, 25, 25
    };
int[] amplitudes = new int[] {
        38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
        0, 85, 170, 255, 170, 85, 0
    };
int repeatIndex = -1; // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

इनपुट वेवफ़ॉर्म का प्लॉट, जिसमें कुछ और चरण शामिल हैं.
मेज़र किए गए वेवफ़ॉर्म का प्लॉट, जिसमें स्मूथ ट्रांज़िशन दिख रहे हैं.

ज़्यादा मुश्किल हैप्टिक इफ़ेक्ट बनाना

क्लिक के बाद मिले जवाब में मौजूद अन्य एलिमेंट ज़्यादा जटिल होते हैं. इसके लिए, डिवाइस में इस्तेमाल किए गए एलआरए के बारे में कुछ जानकारी होना ज़रूरी है. बेहतर नतीजों के लिए, डिवाइस के पहले से तैयार किए गए वेवफ़ॉर्म और प्लैटफ़ॉर्म के दिए गए कॉन्स्टेंट का इस्तेमाल करें. इससे ये काम किए जा सकते हैं:

  • साफ़ तौर पर दिखने वाले इफ़ेक्ट और प्रिमिटिव लागू करें.
  • नए हैप्टिक इफ़ेक्ट बनाने के लिए, उन्हें एक साथ जोड़ें.

पहले से तय किए गए इन हैप्टिक कॉन्स्टेंट और प्रिमिटिव का इस्तेमाल करके, अच्छी क्वालिटी वाले हैप्टिक इफ़ेक्ट तेज़ी से बनाए जा सकते हैं.