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

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

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

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

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

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

वाइब्रेटर आउटपुट ऐक्सेलरेशन

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

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

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

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

मानवीय समझ की पहचान करने के लिए थ्रेशोल्ड

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

बगल में मौजूद प्लॉट में, समय के साथ होने वाले बदलाव के फ़ंक्शन के तौर पर, मानवीय स्पर्श की पहचान करने के थ्रेशोल्ड को दिखाया गया है. थ्रेशोल्ड डेटा को, Bolanowski Jr. के फ़िगर 1 में मौजूद डिसप्लेसमेंट थ्रेशोल्ड से बदला गया है, एस॰ J., et al. के 1988 के लेख में, "छूने के मैकेनिकल पहलुओं को चार चैनल कंट्रोल करते हैं.".

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

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

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

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

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

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

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

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

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

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

Android, BasicEnvelopeBuilder में इस कन्वर्ज़न को अपने-आप मैनेज करता है. यह सेंसेशन लेवल स्पेस (dBSL) में सामान्य तीव्रता के तौर पर वैल्यू लेता है और उन्हें आउटपुट एक्सेलेरेशन में बदल देता है. दूसरी ओर, WaveformEnvelopeBuilder इस कन्वर्ज़न को लागू नहीं करता. इसके बजाय, यह वैल्यू को ऐक्सेलरेशन स्पेस (Gs) में, सामान्य किए गए आउटपुट ऐक्सेलरेशन ऐम्प्लिटीड के तौर पर लेता है. Envelop 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 // Do not 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; // Do not repeat.

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

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

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

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

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

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