🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Kurt Baudendistel Fri, 06 Jan 1989 17:17
bug report 17
#1606
Author: Kurt Baudendistel
Date: Fri, 06 Jan 1989 17:17
650 lines
16264 bytes
BUG REPORT 17

BEHAVIOR:

fatal signal 4 produced upon compilation

COMPILER VERSION: GNU C++ compiler driver, version 1.25.0

INPUT FILES:

given below in shar file

COMMAND LINE: g++ -v -g rmdif.cc

FILE NAMES:

tm.h = tm-vax.h
md = vax.md

MACHINE: vax 11/780 with BRL UNIX (4.2 BSD)

SHAR FILE:
----------------------------------------------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	bug/Stream.h
#	bug/debug.h
#	bug/doubleCbuffer.h
#	bug/doubleComplex.h
#	bug/doubleFft.h
#	bug/lmath.h
#	bug/overload.h
#	bug/rmdif.cc
#	bug/std.h
# This archive created: Fri Jan  6 12:10:33 1989
export PATH; PATH=/bin:$PATH
if test -f 'bug/Stream.h'
then
	echo shar: will not over-write existing file "'bug/Stream.h'"
else
cat << \SHAR_EOF > 'bug/Stream.h'
//
// Stream.h : local augmented version of stream.h
//

#ifndef _Stream_h_
#define _Stream_h_

#include <overload.h>
#include <stream.h>

struct istream_init {
  istream_init()
    { set_File_error_handler(fatal_File_error_handler); }
} istream_init_dummy;

inline char* FileExt(const char* fname, const char* fext) {
  if ( !index(fname,'.') ) {
    char* c = new char[strlen(fname) + strlen(fext) + 2];
    strcpy(c,fname);
    strcat(c,".");
    strcat(c,fext);
    return c;
  }
  else
    return fname;
}

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/debug.h'
then
	echo shar: will not over-write existing file "'bug/debug.h'"
else
cat << \SHAR_EOF > 'bug/debug.h'
//
// debug.h : code debugging aids
//

#ifndef _debug_h_
#define _debug_h_

#define show(x) cout << #x ## " = " << x << "\n"

#endif

SHAR_EOF
fi # end of overwriting check
if test -f 'bug/doubleCbuffer.h'
then
	echo shar: will not over-write existing file "'bug/doubleCbuffer.h'"
else
cat << \SHAR_EOF > 'bug/doubleCbuffer.h'
//
// doubleCbuffer.h : circular buffer class definition 
//

#ifndef _doubleCbuffer_h_
#define _doubleCbuffer_h_

#include <stream.h>
#include <error.h>

//
// doubleCbuffer : circular buffer class
//
//	supports
//	- run time buffer size specification
//	- buffer value load operator =
//	- first value extraction / assignment operator *
//	- Nth value extraction / assignment operator []
//	- buffer shift ++, --, +=, -=
//	- standard output operator <<
//
//	notes
//	- size 0 buffers are fully supported, except that
//	  requests for the contents of these buffers (via
//	  `*' and `[]') return garbage.
//	- subscripts of the `[]' operator are not checked
//	  for validity and will return garbage if illegal
//	  ( not 0 <= x < size ).
//

class doubleCbuffer {
  int	bsize;				// buffer size
  double *base,				// buffer base
    *end,				// end of buffer
    *start;				// current beginning

public:
  doubleCbuffer(int i) {
    bsize = i; 
    base = start = new double[bsize ? bsize : 1]; 
    end = base + bsize; }
  doubleCbuffer(doubleCbuffer& c)
    { doubleCbuffer(c.bsize,c); }
  doubleCbuffer(int i, doubleCbuffer& c) {
    bsize = i;
    base = start = new double[bsize ? bsize : 1]; 
    end = base + bsize;
    double *p = base; 
    for ( int j=0; j < c.bsize; j++ ) *p++ = c[j]; }
  doubleCbuffer(int i, double *q) {
    bsize = i;
    base = start = new double[bsize ? bsize : 1]; 
    end = base + bsize;
    for ( double *p=base; p < end; ) *p++ = *q++; }
  doubleCbuffer(int i, double d) {
    bsize = i;
    base = start = new double[bsize ? bsize : 1]; 
    end = base + bsize;
    for ( double *p=base; p < end; ) *p++ = d; }
  doubleCbuffer(int i, istream& s) {
    bsize = i;
    base = start = new double[bsize ? bsize : 1]; 
    end = base + bsize;
    for ( double *p=base; p < end; ) s >> *p++; 
    if ( !s ) warning("doubleCbuffer(istream&) : error on input"); }

  ~doubleCbuffer()
    { delete base; }

  doubleCbuffer& operator=(doubleCbuffer& c) {
    if ( this != &c ) {
      start = base;
      double *p=base;
      for ( int i=0; i < c.bsize; i++ ) *p++ = c[i];
    }
    return *this; }
  doubleCbuffer& operator=(double *q) {
    start = base;
    for ( double *p=base; p < end; ) *p++ = *q++;
    return *this; }

  double& operator*()
    { return *start; }
  double& operator[](int i)
    { return start+i >= end ? *(start+i-bsize) : *(start+i); }

  doubleCbuffer& operator++()
    { if ( ++start >= end ) start = base; return *this; }
  doubleCbuffer& operator--()
    { if ( --start < base ) start = end-1; return *this; }

  doubleCbuffer& operator+=(int i) {
    start += i; 
    if ( bsize )
      while ( start >= end ) start -= bsize; 
    return *this; }
  doubleCbuffer& operator-=(int i) {
    start -= i; 
    if ( bsize )
      while ( start < base ) start += bsize; 
    return *this; }

  friend int size(doubleCbuffer& c)
    { return c.bsize; }

  friend ostream& operator<<(ostream& s, doubleCbuffer& c) {
    s << "[";
    for ( int i=0; i < c.bsize; i++ ) s << " " << c[i]; 
    s << " ]";
    return s; }
};

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/doubleComplex.h'
then
	echo shar: will not over-write existing file "'bug/doubleComplex.h'"
else
cat << \SHAR_EOF > 'bug/doubleComplex.h'
//
// doubleComplex.h : prototypable complex class
//

#ifndef _doubleComplex_h
#define _doubleComplex_h 1

#include <stream.h>
#include <std.h>

class doubleComplex
{
  double              re;
  double              im;

public:
                   doubleComplex();
                   doubleComplex(doubleComplex& c);
                   doubleComplex(double r, double i = 0.0);

                   ~doubleComplex();

  doubleComplex&      operator =  (doubleComplex& y);

  friend int       operator == (doubleComplex& x, doubleComplex& y);
  friend int       operator == (doubleComplex& x, double y);

  friend int       operator != (doubleComplex& x, doubleComplex& y);
  friend int       operator != (doubleComplex& x, double y);

  doubleComplex       operator +  ();
  doubleComplex       operator -  ();
  doubleComplex       operator ~  ();

  friend doubleComplex   operator +  (doubleComplex& x, doubleComplex& y);
  friend doubleComplex   operator -  (doubleComplex& x, doubleComplex& y);
  friend doubleComplex   operator *  (doubleComplex& x, doubleComplex& y);
  friend doubleComplex   operator /  (doubleComplex& x, doubleComplex& y);

  doubleComplex&         operator += (doubleComplex& y); 
  doubleComplex&         operator -= (doubleComplex& y); 
  doubleComplex&         operator *= (doubleComplex& y); 
  doubleComplex&         operator /= (doubleComplex& y); 

  friend double&   real(doubleComplex& x);
  friend double&   imag(doubleComplex& x);
  friend double    norm(doubleComplex& x);

  friend istream&  operator >> (istream& s, doubleComplex& x);
  friend ostream&  operator << (ostream& s, doubleComplex& x);

  void             error(char* msg);
};

// error handlers

extern  void default_doubleComplex_error_handler(char*);
extern  one_arg_error_handler_t doubleComplex_error_handler;

extern  one_arg_error_handler_t 
        set_doubleComplex_error_handler(one_arg_error_handler_t f);

//#ifdef __OPTIMIZE__

inline doubleComplex:: doubleComplex() {}
inline doubleComplex::~doubleComplex() {}

inline doubleComplex::doubleComplex(double r, double i = 0.0)
{
  re = r;
  im = i;
}

inline doubleComplex::doubleComplex(doubleComplex& x)
{
  re = x.re;
  im = x.im;
}

inline doubleComplex& doubleComplex::operator = (doubleComplex& x)
{
  re = x.re;
  im = x.im;
  return *this;
}

inline int operator == (doubleComplex& x, doubleComplex& y)
{
  return x.re == y.re && x.im == y.im;
}

inline int operator == (doubleComplex& x, double y)
{
  return x.im == 0.0 && x.re == y;
}

inline int operator != (doubleComplex& x, doubleComplex& y)
{
  return x.re != y.re || x.im != y.im;
}

inline int operator != (doubleComplex& x, double y)
{
  return x.im != 0.0 || x.re != y;
}

inline doubleComplex doubleComplex::operator + ()
{
  return *this;
}

inline doubleComplex doubleComplex::operator - ()
{
  return doubleComplex(-re, -im);
}

inline doubleComplex doubleComplex::operator ~ ()
{
  return doubleComplex(re, -im);
}

inline doubleComplex operator + (doubleComplex& x, doubleComplex& y)
{
  return doubleComplex(x.re + y.re, x.im + y.im);
}

inline doubleComplex operator - (doubleComplex& x, doubleComplex& y)
{
  return doubleComplex(x.re - y.re, x.im - y.im);
}

inline doubleComplex operator * (doubleComplex& x, doubleComplex& y)
{
  return doubleComplex(x.re * y.re - x.im * y.im, x.re * y.im + x.im * y.re);
}

inline doubleComplex& doubleComplex::operator += (doubleComplex& y)
{
  re += y.re;
  im += y.im;
  return *this;
}

inline doubleComplex& doubleComplex::operator -= (doubleComplex& y)
{
  re -= y.re;
  im -= y.im;
  return *this;
}

inline doubleComplex& doubleComplex::operator *= (doubleComplex& y)
{
  double r = re * y.re - im * y.im;
  im = re * y.im + im * y.re;
  re = r;
  return *this;
}

inline double& real(doubleComplex& x)
{
  return x.re;
}

inline double& imag(doubleComplex& x)
{
  return x.im;
}

inline double norm(doubleComplex& x)
{
  return (x.re * x.re + x.im * x.im);
}

//#endif

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/doubleFft.h'
then
	echo shar: will not over-write existing file "'bug/doubleFft.h'"
else
cat << \SHAR_EOF > 'bug/doubleFft.h'
//
// doubleFft.h : double fft functions
//

#ifndef _doubleFft_h
#define _doubleFft_h

#include <doubleComplex.h>

overload fft;

// twiddle factor array
class doubleTwiddle {
  int fsize;				// fft size
  int dsize;				// data size: lengthof(data) 
  doubleComplex* data;			// twiddle factors

public:
  doubleTwiddle(int N, double = 1.0);		// constructor: size & stage gain
  ~doubleTwiddle() { delete data; }

  friend doubleComplex* fft(doubleComplex*, const doubleTwiddle&);
};

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/lmath.h'
then
	echo shar: will not over-write existing file "'bug/lmath.h'"
else
cat << \SHAR_EOF > 'bug/lmath.h'

//
// lmath.h : local math definition file
//

#ifndef _lmath_h_
#define _lmath_h_

#include <overload.h>

inline int max(int a,int b)
  { return a > b ? a : b; }
inline int min(int a,int b)
  { return a < b ? a : b; }

inline long max(long a,long b)
  { return a > b ? a : b; }
inline long min(long a,long b)
  { return a < b ? a : b; }

inline double max(double a,double b)
  { return a > b ? a : b; }
inline double min(double a,double b)
  { return a < b ? a : b; }

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/overload.h'
then
	echo shar: will not over-write existing file "'bug/overload.h'"
else
cat << \SHAR_EOF > 'bug/overload.h'
//
// overload.h : single repository for overload statements
//
//	this single repository avoids warning messages of multiple
//	overloads.
//

#ifndef _overload_h_
#define _overload_h_

overload warning;
overload error;
overload abort;

overload square;
overload min;
overload max;

#endif
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/rmdif.cc'
then
	echo shar: will not over-write existing file "'bug/rmdif.cc'"
else
cat << \SHAR_EOF > 'bug/rmdif.cc'
//
// rmdif: rapid measurement of digital instantaneous frequency
//	  taken from Griffiths: ASSP-23, No. 2, pp. 207-22
//
// input:  sampled data file
// output: sample number / dectected signal pairs

// header inclusion
#include <Stream.h>
#include <math.h>
#include <lmath.h>
#include <debug.h>
#include <Random.h>
#include <ACG.h>

// type definition -- set type in following:
#include <doubleComplex.h>
#include <doubleFft.h>
#include <doubleCbuffer.h>

// type definition -- change the following in the rest of the code:
// double
// doubleComplex
// doubleTwiddle 
// doubleCbuffer

// external data
char usage[] = "\
usage: rmdif alpha filter_length snr signal_gain output_interval \n\
             fft_length detection_threshold";

// external definitions
#define LMAX	255

// macro definitions
#define argument(n, scanstring, x)				\
	if ( argc > n && sscanf(argv[n], scanstring, &x) != 1 )	\
	  error(usage)

// function declarations
double noise(double x, double signal_gain, double noise_gain);
void lms(double x, double mu, double* g, doubleCbuffer z);
void mspec(int M, int L, int N, double* g, doubleTwiddle W, double threshold);

// main function
main(int argc, char** argv) {
  int L = 4,				// filter length
    I = 4,				// output interval
    N = 256;				// fft length

  double alpha = 1.0,			// lms parameter
    snr = 1000.0,			// signal-to-noise ratio
    sgain = 1.0,			// signal gain
    threshold = 50.;			// detection threshold

  if ( argc > 7 )
    error(usage);
  argument(1, "%f", alpha);
  argument(2, "%d", L);
  argument(3, "%f", snr);
  argument(4, "%f", sgain);
  argument(5, "%d", I);
  argument(6, "%d", N);

  if ( alpha <= 0. || L < 2 || L >= LMAX || sgain <= 0. || I <= 0 || N < 4 )
    error("rmdif: parameter out of bounds");

  double ngain 				// noise gain
      = (snr >= 1000.0 ? 0.0 : sgain * pow(10, -snr/20.) / sqrt(2.)),
    x;					// input data

  double mu				// lms paramter
      = alpha / max( L * ( sgain * sgain / 2. + ngain * ngain ), .0001 ),
    X,					// noisy input data
    T = 1. / threshold;			// spectrum detection threshold

  double g[L+1];			// filter coefficients
  g[0] = 1.;

  doubleCbuffer z(L,0.);		// filter delay line

  doubleTwiddle W(N,0.5);		// twiddle factors (stage gain = .5)

  int i = I,				// output count
    m = 1;				// sample count

  // process data
  for ( ; cin >> x; m++ ) {
    X = noise(x, sgain, ngain);
    lms(X, mu, g, z);
    if ( --i <= 0 ) {
      i = I;
      mspec(m, L+1, N, g, W, T);
    }
  }
}

double noise(double x, double signal_gain, double noise_gain) {
  static ACG gen(10,20);
  static Normal rnd(0,1);

  return signal_gain * x + noise_gain * rnd();
}

void lms(double x, double mu, double* g, doubleCbuffer z) {
  for ( int i=0; i < size(z); i++ )
    g[i+1] = g[i+1] + mu * ( x + g[i+1] * z[i] );
  *--z = x;
}

overload MGmin;
inline int MGmin(double T, double g1, double g2, double g3) {
  return g1 < T && g1 < g2 && g1 < g3;
}

inline int MGmin(double T, double g1, double g2) {
  return g1 < T && g1 < g2;
}

void mspec(int M, int L, int N, double* g, doubleTwiddle W, double T) {
  doubleComplex G[N];			// fft workspace

  // form fft of filter coefficients
  for ( int i=0; i < L; i++ )		// initialize fft workspace
    G[i] = g[i];
  for ( ; i < N; i++ )
    G[i] = 0;
  fft(G,W);				// perform fft operation

  double MG[N];				// set magnitude of fft
  for ( i=0; i < N; i++ )
    MG[i] = norm(G[i]);

  if ( MGmin(T, MG[0], MG[1]) )		// find all local minima
    cout << M << " " << 0.0 << "\n";
  for ( i=1; i < N; i++ )
    if ( MGmin(T, MG[i], MG[i-1], MG[i+1]) )
      cout << M << " " << double(i)/N << "\n";
  if ( MGmin(T, MG[N-1], MG[N-2]) )
    cout << M << " " << double(N/2-1)/N << "\n";
}
SHAR_EOF
fi # end of overwriting check
if test -f 'bug/std.h'
then
	echo shar: will not over-write existing file "'bug/std.h'"
else
cat << \SHAR_EOF > 'bug/std.h'
//
// std.h : local version of std.h
//

#include <overload.h>
#include "/usr/local/lib/g++-include/std.h"

SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads