Metropoli BBS
VIEWER: oktime3d.c MODE: TEXT (ASCII)
/***************************************************************************
 *		  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.
 *              7-Feb-95 CPP (1.31); Progress Requester
 *
 * 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 */

long Actual_Time_Segments = 1;  /* Used by progress indicator */
extern long Inner_Loop_Count;

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_seg_size = TimeSegSize;
    long time_offset = TimeOffset;
    long i;

    Actual_Time_Segments = TimeSegments;

    if (time_overlap == INVALID_SET ||
	time_offset == INVALID_SET ||
	Actual_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 (Actual_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) * (Actual_Time_Segments - 1)));
	    time_offset = fudge + (time_seg_size * (1.0 - time_overlap));
	}
	else
	{
	    time_seg_size = frames - (time_offset * (Actual_Time_Segments - 1));
	}
    }
    else
    {
	if (time_offset = NOT_SET)
	{
	    time_offset = fudge + (time_seg_size * (1.0 - time_overlap));
	}
	Actual_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;

    Inner_Loop_Count = 0;
    running_offset = save_ok_start_frame;
    for (i = 0; i < Actual_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;
    Actual_Time_Segments = 1;
    return bins_used;
}
[ RETURN TO DIRECTORY ]