ভাইব্রেশন ওয়েভফর্ম বিশ্লেষণ করা

Android ডিভাইসে সবচেয়ে সাধারণ ভাইব্রেশন অ্যাকচুয়েটর হল লিনিয়ার রেসোন্যান্ট অ্যাকচুয়েটর (LRA)। LRA, অন্যথায় কাজ না করা কাঁচের সারফেসে বোতামে ক্লিক করার অনুভূতি তৈরি করে। পরিষ্কার ও ঝকঝকে ক্লিক ফিডব্যাক সিগন্যালের সময়সীমা সাধারণত ১০ থেকে ২০ মিলিসেকেন্ড হয়। এই অনুভূতি ব্যবহারকারীর ইন্টার‍্যাকশনকে আরও স্বাভাবিক করে তোলে। ভার্চুয়াল কীবোর্ডের ক্ষেত্রে, এই ক্লিক ফিডব্যাক টাইপিং স্পিড বাড়াতে এবং ভুল কমাতে পারে।

LRA-এর কিছু সাধারণ রেজোন্যান্ট ফ্রিকোয়েন্সি থাকে:

  • কিছু LRA-এর রেসোন্যান্ট ফ্রিকোয়েন্সি ২০০ থেকে ৩০০ Hz রেঞ্জে ছিল, যা সেই ফ্রিকোয়েন্সির সাথে মিলে যায় যেখানে মানুষের ত্বক কম্পনের প্রতি সবচেয়ে বেশি সংবেদনশীল। এই ফ্রিকোয়েন্সি রেঞ্জে কম্পনের অনুভূতিকে সাধারণত মসৃণ, তীক্ষ্ণ ও গভীর বলে বর্ণনা করা হয়।
  • LRA-এর অন্যান্য মডেলে রেসোন্যান্স ফ্রিকোয়েন্সি কম থাকে, প্রায় ১৫০ Hz. এর ফলে যে অনুভূতি হয় তা তুলনামূলকভাবে অনেক বেশি নরম ও পূর্ণ (ডাইমেনশন অনুযায়ী)।
উপাদানগুলির মধ্যে, উপর থেকে নিচে, একটি কভার, প্লেট, মিডল
       ম্যাগনেট, ২টি সাইড ম্যাগনেট, মাস, ২টি স্প্রিং, কয়েল, ফ্লেক্সিবল সার্কিট, বেস,
       এবং আঠালো অংশ অন্তর্ভুক্ত।
লিনিয়ার রেসোন্যান্ট অ্যাকচুয়েটর (LRA)-এর কম্পোনেন্ট।

দুটি আলাদা ফ্রিকোয়েন্সিতে একই ইনপুট ভোল্টেজ দেওয়া হলে, ভাইব্রেশন আউটপুট অ্যামপ্লিটিউড আলাদা হতে পারে। LRA-এর রেজোন্যান্ট ফ্রিকোয়েন্সি থেকে ফ্রিকোয়েন্সি যত দূরে থাকবে, এর কম্পনের অ্যামপ্লিটিউড তত কম হবে।

কোনও ডিভাইসের হ্যাপ্টিক এফেক্ট ভাইব্রেশন অ্যাকচুয়েটর ও এর ড্রাইভার, দুটিই ব্যবহার করে। ওভারড্রাইভ ও অ্যাক্টিভ ব্রেকিং ফিচার সহ হ্যাপটিক ড্রাইভার LRA-এর রাইজ টাইম ও রিং করা কমাতে পারে, এর ফলে আরও বেশি রেসপন্সিভ ও স্পষ্ট ভাইব্রেশন পাওয়া যায়।

ভাইব্রেটর আউটপুট অ্যাক্সিলারেশন

ফ্রিকোয়েন্সি-টু-আউটপুট-অ্যাক্সিলারেশন ম্যাপিং (FOAM) কোনও নির্দিষ্ট ভাইব্রেশন ফ্রিকোয়েন্সিতে (হার্ৎজ এককে) অর্জনযোগ্য সর্বোচ্চ আউটপুট অ্যাক্সিলারেশন (G পিক এককে) বর্ণনা করে। Android 16 (API লেভেল 36) থেকে শুরু করে, প্ল্যাটফর্ম VibratorFrequencyProfile-এর মাধ্যমে এই ম্যাপিংয়ের জন্য বিল্ট-ইন সাপোর্ট প্রদান করে। হ্যাপ্টিক এফেক্ট তৈরি করতে, প্রাথমিক ও উন্নত এনভেলপ API-এর সাথে এই ক্লাস ব্যবহার করতে পারবেন।

বেশিরভাগ LRA মোটরের FOAM-এ একটি করে পিক থাকে, সাধারণত সেটি রেসোন্যান্ট ফ্রিকোয়েন্সির কাছাকাছি থাকে। এই রেঞ্জ থেকে ফ্রিকোয়েন্সি সরে গেলে অ্যাক্সিলারেশন সাধারণত এক্সপোনেনশিয়ালি কমে যায়। কার্ভটি সিমেট্রিক্যাল নাও হতে পারে এবং মোটরকে ক্ষতি থেকে রক্ষা করার জন্য রেসোন্যান্ট ফ্রিকোয়েন্সির আশেপাশে একটি প্লাটো থাকতে পারে।

পাশের প্লটে LRA মোটরের জন্য FOAM-এর একটি উদাহরণ দেখানো হয়েছে।

ফ্রিকোয়েন্সি প্রায় ১২০ Hz পর্যন্ত বাড়লে, ত্বরণ
       দ্রুত বাড়তে থাকে। তারপরে, অ্যাক্সিলারেশন ১৮০ Hz পর্যন্ত একই থাকে,
       তারপরে তা কমতে থাকে।
LRA মোটরের জন্য FOAM-এর উদাহরণ।

মানুষের পারসেপশন শনাক্তকরণের থ্রেশহোল্ড

মানুষের পারসেপশন শনাক্তকরণ থ্রেশহোল্ড বলতে ভাইব্রেশনের ন্যূনতম অ্যাক্সিলারেশনকে বোঝায় যা কোনও ব্যক্তি নির্ভরযোগ্যভাবে শনাক্ত করতে পারেন। কম্পনের ফ্রিকোয়েন্সির উপর নির্ভর করে এই লেভেল পরিবর্তিত হয়।

পাশের প্লটে, টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসেবে অ্যাক্সিলারেশনে, হিউম্যান হ্যাপটিক পারসেপশন ডিটেকশন থ্রেশহোল্ড দেখানো হয়েছে। থ্রেশহোল্ড ডেটা হল Bolanowski Jr.-এর ১ নম্বর ছবিতে দেখানো ডিসপ্লেসমেন্ট থ্রেশহোল্ড থেকে কনভার্ট করা ডেটা, S. J., et al.-এর ১৯৮৮ সালের নিবন্ধ, "স্পর্শের মেকানিক্যাল দিকগুলি চারটি চ্যানেল দ্বারা মধ্যস্থতা করা হয়।"।

Android অটোমেটিক এই থ্রেশহোল্ড BasicEnvelopeBuilder-এ ম্যানেজ করে, যা যাচাই করে যে সমস্ত এফেক্ট এমন ফ্রিকোয়েন্সি রেঞ্জ ব্যবহার করে যা অন্তত ১০ dB-এর বেশি ভাইব্রেশন অ্যামপ্লিটিউড তৈরি করে।

ফ্রিকোয়েন্সি ২০ Hz-এর কাছাকাছি বেড়ে গেলে, হিউম্যান ডিটেকশন থ্রেশহোল্ড
       লগারিদমিকভাবে বেড়ে প্রায় -৩৫ dB হয়ে যায়। থ্রেশহোল্ড প্রায় ২০০ Hz পর্যন্ত স্থির থাকে, তারপরে -২০ dB পর্যন্ত মোটামুটি লিনিয়ারভাবে বাড়তে থাকে।
মানুষের হ্যাপ্টিক পারসেপশন শনাক্তকরণের থ্রেশহোল্ড।

ত্বরণ, অ্যামপ্লিটিউড ও ডিসপ্লেসমেন্ট অ্যামপ্লিটিউডের মধ্যে কনভার্সন সম্পর্কে অনলাইন টিউটোরিয়ালে আরও ব্যাখ্যা করা হয়েছে।

ভাইব্রেশন অ্যাক্সিলারেশন লেভেল

কম্পনের তীব্রতা সম্পর্কে মানুষের ধারণা, যা একটি ধারণা পরিমাপ, কম্পনের অ্যামপ্লিটিউডের সাথে রৈখিকভাবে বৃদ্ধি পায় না, এটি একটি ফিজিক্যাল প্যারামিটার। অনুভূত তীব্রতা সংবেদন লেভেল (SL) দ্বারা চিহ্নিত করা হয়, যা একই ফ্রিকোয়েন্সিতে শনাক্তকরণ থ্রেশহোল্ডের উপরে dB পরিমাণ হিসেবে সংজ্ঞায়িত করা হয়।

সংশ্লিষ্ট কম্পন ত্বরণের প্রশস্ততা (G পিক-এ) নিম্নলিখিত উপায়ে গণনা করা যেতে পারে:

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

...যেখানে অ্যামপ্লিটিউড dB হল SL এবং শনাক্তকরণ থ্রেশহোল্ডের যোগফল— পাশাপাশি প্লটে উল্লম্ব অক্ষ বরাবর ভ্যালু—একটি নির্দিষ্ট ফ্রিকোয়েন্সিতে।

পাশের প্লটে ১০, ২০, ৩০, ৪০ এবং ৫০ dB SL-এ কম্পন অ্যাক্সিলারেশন লেভেল দেখানো হয়েছে। এর সাথে, হিউম্যান হ্যাপটিক পারসেপশন ডিটেকশন থ্রেশহোল্ড (০ dB SL)-ও দেখানো হয়েছে। এগুলি টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসেবে দেখানো হয়েছে। এই ডেটা Verrillo, R.-এর Figure 8 থেকে অনুমান করা হয়েছে। T., et al.'s 1969 article, "Sensation magnitude of vibrotactile stimuli.".

আকাঙ্ক্ষিত সংবেদন লেভেল যত বাড়তে থাকে, dB-তে প্রয়োজনীয় অ্যাক্সিলারেশন,
       প্রায় একই পরিমাণে বাড়তে থাকে। যেমন, ১০০ Hz কম্পনের জন্য ১০ dB
       সংবেদন লেভেল হল -২০ dB, -৩০ dB নয়।
ভাইব্রেশন অ্যাক্সিলারেশন লেভেল।

Android অটোমেটিক এই কনভার্সনটি BasicEnvelopeBuilder-এ হ্যান্ডেল করে, যা সেনসেশন লেভেল স্পেসে (dB SL) স্বাভাবিক করা ইনটেনসিটি হিসেবে ভ্যালু নেয় এবং সেগুলিকে আউটপুট অ্যাক্সিলারেশনে কনভার্ট করে। অন্যদিকে, WaveformEnvelopeBuilder এই কনভার্সন প্রয়োগ করে না এবং পরিবর্তে অ্যাক্সিলারেশন স্পেসে (Gs) স্বাভাবিক করা আউটপুট অ্যাক্সিলারেশন অ্যামপ্লিটিউড হিসেবে ভ্যালু নেয়। এনভেলপ 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))

জাভা

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));

নিচের প্লটগুলি ইনপুট ওয়েভফর্ম এবং আউটপুট অ্যাক্সিলারেশন দেখায় যা আগের কোড স্নিপেটের সাথে সম্পর্কিত। মনে রাখবেন, প্যাটার্নে অ্যামপ্লিটিউডের ধাপে ধাপে পরিবর্তন হলে—অর্থাৎ, 0ms, 150ms, 200ms, 250ms এবং 700ms-এ—অ্যাক্সিলারেশন হঠাৎ করে নয়, ধীরে ধীরে বাড়ে। এছাড়াও, অ্যামপ্লিটিউডের প্রতিটি ধাপ পরিবর্তনের সময় ওভারশুট হয় এবং ইনপুট অ্যামপ্লিটিউড হঠাৎ করে ০-এ নেমে গেলে অন্তত ৫০ms ধরে রিং হতে দেখা যায়।

স্টেপ ফাংশন ইনপুট ওয়েভফর্মের প্লট।
লেভেলের মধ্যে আরও অর্গানিক ট্রানজিশন দেখানো, প্রকৃত পরিমাপ করা ওয়েভফর্মের প্লট ।

উন্নত হ্যাপ্টিক প্যাটার্ন

ওভারশুট এড়াতে এবং রিং করার সময় কমাতে, অ্যামপ্লিটিউডগুলি আরও ধীরে ধীরে পরিবর্তন করুন। নিচে সংশোধিত ভার্সনের ওয়েভফর্ম ও অ্যাক্সিলারেশন প্লট দেখানো হল:

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))

জাভা

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));

অতিরিক্ত ধাপ সহ ইনপুট ওয়েভফর্মের প্লট।
পরিমাপ করা ওয়েভফর্মের প্লট, যা আরও মসৃণ ট্রানজিশন দেখায়।

আরও জটিল হ্যাপ্টিক এফেক্ট তৈরি করা

সন্তুষ্টজনক ক্লিক উত্তরের অন্যান্য এলিমেন্ট আরও জটিল, এর জন্য ডিভাইসে ব্যবহৃত LRA-এর কিছু জ্ঞান থাকা প্রয়োজন। সবচেয়ে ভালো ফলাফল পেতে, ডিভাইসের আগে থেকে তৈরি ওয়েভফর্ম ও প্ল্যাটফর্মের দেওয়া কনস্ট্যান্ট ব্যবহার করুন, যা আপনাকে এগুলি করতে দেয়:

  • পরিষ্কার এফেক্ট ও প্রিমিটিভ পারফর্ম করুন।
  • নতুন হ্যাপ্টিক এফেক্ট কম্পোজ করতে সেগুলি কনক্যাটেনেট করুন।

উচ্চ-কোয়ালিটির হ্যাপ্টিক এফেক্ট তৈরি করার সময় এইসব আগে থেকে সংজ্ঞায়িত হ্যাপ্টিক ধ্রুবক ও আদিম উপাদান আপনার কাজকে অনেক দ্রুত করে তুলতে পারে।