home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************
- * Copyright (C) 1994 Charles P. Peterson *
- * 4007 Enchanted Sun, San Antonio, Texas 78244-1254 *
- * Email: Charles_P_Peterson@fcircus.sat.tx.us *
- * *
- * This is free software with NO WARRANTY. *
- * See gfft.c, or run program itself, for details. *
- * Support is available for a fee. *
- ***************************************************************************
- *
- * Program: gfft--General FFT analysis
- * File: oktime3d.c
- * Purpose: do a time-3D spectrum (meaning amplitude vs. freq. vs. time)
- * Author: Charles Peterson (CPP)
- * History: 10-February-1994 CPP; Created.
- * 29-August-1994 CPP (1.12); offset start time by 1/2
- * interval to permit logarithmic displays.
- * Comment: To preserve the full set of options available in a regular
- * ('flat') FFT, this function simply sets up and calls
- * ok_spectrum for each 'time segment.'
- * It 'forces' each segment by setting StartFrame and Frames
- * as required. Their original values are preserved
- * here.
- * The real StartFrame (as specified by user) and Frames
- * are to refer to the dataset as a whole,
- * and NOT to each Time Segment. Most other options
- * (Overlap, Pad, Interleave, etc.) may still be applied
- * to each individual time segment.
- */
-
- #include "gfft.h"
- #include "settings.h" /* Power, Amplitude, ReadPtr */
-
- ULONG ok_time3d_spectrum (BOOLEAN do_it_for_real)
- {
- ULONG save_ok_start_frame = OkStartFrame;
- ULONG save_ok_frames = OkFrames;
- ULONG dummy = 0;
- ULONG frames;
- ULONG running_offset;
- ULONG bins_used = 0;
- double segment_time_increment;
- double fudge = 1.0 / LONG_MAX; /* compensate for floating inaccuracy */
- double time_overlap = TimeOverlap;
- long time_segments = TimeSegments;
- long time_seg_size = TimeSegSize;
- long time_offset = TimeOffset;
- long i;
-
- if (time_overlap == INVALID_SET ||
- time_offset == INVALID_SET ||
- time_segments == INVALID_SET ||
- time_seg_size == INVALID_SET)
- {
- error_message (INVALID_TIMESEG_PARAMETERS);
- RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */
- }
-
- frames = (OkFrames != ULONG_MAX) ? OkFrames :
- ok_read (NULL, dummy);
-
- if (time_seg_size == NOT_SET)
- {
- if (time_segments == NOT_SET)
- {
- error_message (MISSING_TIMESEG_PARAMETERS);
- RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */
- }
- if (time_offset == NOT_SET)
- {
- time_seg_size = fudge + (frames /
- (1.0 + (1.0 - time_overlap) * (time_segments - 1)));
- time_offset = fudge + (time_seg_size * (1.0 - time_overlap));
- }
- else
- {
- time_seg_size = frames - (time_offset * (time_segments - 1));
- }
- }
- else
- {
- if (time_offset = NOT_SET)
- {
- time_offset = fudge + (time_seg_size * (1.0 - time_overlap));
- }
- time_segments = ((frames - time_seg_size) / time_offset) + 1;
- }
- /*
- * Now, we have the all dependent and independent parameters
- */
- segment_time_increment = time_seg_size / OkRate;
- OkSegmentTime = segment_time_increment / 2;
-
- running_offset = save_ok_start_frame;
- for (i = 0; i < time_segments; i++)
- {
- OkStartFrame = running_offset;
- OkFrames = time_seg_size;
-
- ok_rewind ();
- bins_used = ok_spectrum (do_it_for_real);
- if (!do_it_for_real) return bins_used;
-
- running_offset += time_offset;
- OkSegmentTime += segment_time_increment;
- }
- OkStartFrame = save_ok_start_frame;
- OkFrames = save_ok_frames;
- return bins_used;
- }
-