/* ================================================== */
-void
-SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double doffset)
+static int
+get_first_last(SPF_Instance filter, int *first, int *last)
{
- int i, first, last;
- double delta_time;
-
if (filter->last < 0)
- return;
+ return 0;
/* Always slew the last sample as it may be returned even if no new
samples were accumulated */
if (filter->used > 0) {
- first = 0;
- last = filter->used - 1;
+ *first = 0;
+ *last = filter->used - 1;
} else {
- first = last = filter->last;
+ *first = *last = filter->last;
}
+ return 1;
+}
+
+
+/* ================================================== */
+
+void
+SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double doffset)
+{
+ int i, first, last;
+ double delta_time;
+
+ if (!get_first_last(filter, &first, &last))
+ return;
+
for (i = first; i <= last; i++) {
UTI_AdjustTimespec(&filter->samples[i].time, when, &filter->samples[i].time,
&delta_time, dfreq, doffset);
/* ================================================== */
+void
+SPF_CorrectOffset(SPF_Instance filter, double doffset)
+{
+ int i, first, last;
+
+ if (!get_first_last(filter, &first, &last))
+ return;
+
+ for (i = first; i <= last; i++)
+ filter->samples[i].offset -= doffset;
+}
+
+/* ================================================== */
+
void
SPF_AddDispersion(SPF_Instance filter, double dispersion)
{
extern int SPF_GetFilteredSample(SPF_Instance filter, NTP_Sample *sample);
extern void SPF_SlewSamples(SPF_Instance filter, struct timespec *when,
double dfreq, double doffset);
+extern void SPF_CorrectOffset(SPF_Instance filter, double doffset);
extern void SPF_AddDispersion(SPF_Instance filter, double dispersion);
#endif
TEST_CHECK(!memcmp(&sample_in, &sample_out, sizeof (sample_in)));
SPF_SlewSamples(filter, &sample_in.time, 0.0, 0.0);
+ SPF_CorrectOffset(filter, 0.0);
SPF_AddDispersion(filter, 0.0);
if (k + 1 < min_samples)