RTTY 45.45 बॉड के मामले में, आपके पास ऐसे प्रतीक भी होंगे जो पूर्णांक संख्या के नमूने नहीं हैं, इसलिए आपको एक फ़ंक्शन की आवश्यकता होती है जिसे प्रत्येक नमूना कहा जा सकता है और फिर उस प्रतीक के समाप्त होने पर इसके वापसी मूल्य में संकेत दे सकता है। और आपको एक चरण संचायक की आवश्यकता होती है, जो साइन लहर के चरण में जहां पर चल रहा है, वहां चल रहा है।
उन प्रतीकों को भेजने के लिए जिनकी लंबाई पूर्णांक दर से अधिक नहीं है, जिन्हें आपको इस फ़ंक्शन की आवश्यकता है ...
int millisecondTimer(double milliseconds, double samplerate, int resettime)
{
static int fracsample=0;
static int counter=0;
static int retvalue=0;
static int first=1;
static double oldmilliseconds=1.0;
static int whole_samples=0;
static int samerror=32768;
if(resettime==1)
{
samerror=0;
counter=0;
retvalue=1;
first=1;
}
if(first==1 || milliseconds !=oldmilliseconds)
{
double samplesneeded=1;
double wholesamples=0;
samplesneeded=(samplerate) * (milliseconds /1000.0);
samerror=(modf(samplesneeded, &wholesamples)) * 32768.0;
whole_samples=wholesamples;
first=0;
}
if(counter<=whole_samples)
{
retvalue=2;
counter++;
}
else
{
counter-=whole_samples;
retvalue=1;
fracsample+=samerror;
oldmilliseconds=milliseconds;
if(fracsample>=32768)
{
fracsample-=32768;
counter--;
}
}
return retvalue;
}
इसका उपयोग करने के लिए, साइन लहर के अगले नमूने को उत्पन्न करें और इस फ़ंक्शन को कॉल करें, फिर जांचें कि क्या वापसी का मूल्य दो के बराबर नहीं है। यदि यह दो के बराबर नहीं है, तो अगले प्रतीक पर आगे बढ़ें और तय करें कि क्या आप अंतरिक्ष का निशान भेज रहे हैं, फिर इस फ़ंक्शन को कोड के ब्लॉक के अंदर फिर से कॉल करें जो तब निष्पादित होता है जब आपको पता चला कि वापसी मूल्य दो के बराबर नहीं है।
और यहां रॉकबॉक्स फर्मवेयर से चरण संचयक है, आयाम में बदलाव की अनुमति देने के लिए (पूर्ण मात्रा 32767 है, चरण पूर्ण मात्रा में 180 डिग्री बाहर -32768 है)।
signed short lerpsin(float frequency,signed short amplitude,unsigned long samplerate)
{
/* 128 sixteen bit sine samples + guard point */
static unsigned long phase=0;
unsigned int pos =0;
unsigned short frac=0;
static unsigned long step=0;
static float old_frequency=0;
signed short diff=0;
static const signed short sinetab[129] =
{
0, 1607, 3211, 4807, 6392, 7961, 9511, 11038,
12539, 14009, 15446, 16845, 18204, 19519, 20787, 22004,
23169, 24278, 25329, 26318, 27244, 28105, 28897, 29621,
30272, 30851, 31356, 31785, 32137, 32412, 32609, 32727,
32767, 32727, 32609, 32412, 32137, 31785, 31356, 30851,
30272, 29621, 28897, 28105, 27244, 26318, 25329, 24278,
23169, 22004, 20787, 19519, 18204, 16845, 15446, 14009,
12539, 11038, 9511, 7961, 6392, 4807, 3211, 1607,
0, -1607, -3211, -4807, -6392, -7961, -9511, -11038,
-12539, -14009, -15446, -16845, -18204, -19519, -20787, -22004,
-23169, -24278, -25329, -26318, -27244, -28105, -28897, -29621,
-30272, -30851, -31356, -31785, -32137, -32412, -32609, -32727,
-32767, -32727, -32609, -32412, -32137, -31785, -31356, -30851,
-30272, -29621, -28897, -28105, -27244, -26318, -25329, -24278,
-23169, -22004, -20787, -19519, -18204, -16845, -15446, -14009,
-12539, -11038, -9511, -7961, -6392, -4807, -3211, -1607,
0,
};
if(frequency!=old_frequency)
{
step = 0x100000000ull*frequency / samplerate;
}
phase+=step;
pos = phase >> 25;
frac = (phase & 0x01ffffff) >> 9;
diff = sinetab[pos + 1] - sinetab[pos];
old_frequency=frequency;
return ((-((sinetab[pos] + (frac*diff >> 16)))) * amplitude) >> 15;
}