X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=wdq2wav.cpp;h=87ab17783014e1954b5d84499abf34099d677f25;hb=22b9b11164032df7d47e512a128f3c4c29ed0047;hp=288a9c6c0e14e67b8357e567eecdd2000559e8de;hpb=390c94da79af45e21594c432e835a8b37044eed5;p=wdq2wav.git diff --git a/wdq2wav.cpp b/wdq2wav.cpp index 288a9c6..87ab177 100644 --- a/wdq2wav.cpp +++ b/wdq2wav.cpp @@ -8,7 +8,7 @@ ** ** Copyright (c) 2003 Kevin Rosenberg ** -** $Id: wdq2wav.cpp,v 1.16 2003/02/12 07:24:32 kevin Exp $ +** $Id: wdq2wav.cpp,v 1.27 2003/03/03 21:52:09 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -26,11 +26,13 @@ #include -const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.16 2003/02/12 07:24:32 kevin Exp $"; +const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.27 2003/03/03 21:52:09 kevin Exp $"; bool g_quiet = false; bool g_verbose = false; bool g_debug = false; +bool g_ignore_zero = false; +bool g_dont_demean = false; #ifdef WIN32 @@ -107,12 +109,14 @@ usage (const char* progname) { std::cout << "usage: " << fileBasename (progname) << " [OPTIONS] \n"; std::cout << "OPTIONS\n"; - std::cout << " -p Play channel through audio system\n"; - std::cout << " -q Supress all messages\n"; - std::cout << " -v Verbose mode\n"; - std::cout << " -d Debug mode\n"; - std::cout << " -r Print program version\n"; - std::cout << " -h Print this help message\n"; + std::cout << " -p Play channel through audio system\n"; + std::cout << " -q Supress all messages\n"; + std::cout << " -z Scale output without preserving zero point\n"; + std::cout << " -m Do not demean the data (don't subtract the mean value from each sample)\n"; + std::cout << " -v Verbose mode\n"; + std::cout << " -d Debug mode\n"; + std::cout << " -r Print program version\n"; + std::cout << " -h Print this help message\n"; } @@ -124,7 +128,7 @@ main (int argc, char *argv[]) const char* progname = argv[0]; - while ((c = getopt (argc, argv, "rqvdph")) != -1) { + while ((c = getopt (argc, argv, "rqvzmdph")) != -1) { switch (c) { case 'r': std::cout << "Version " << g_szIdStr << std::endl; @@ -132,6 +136,12 @@ main (int argc, char *argv[]) case 'q': g_quiet = true; break; + case 'm': + g_dont_demean = true; + break; + case 'z': + g_ignore_zero = true; + break; case 'v': g_verbose = true; break; @@ -254,6 +264,7 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool p ", maximum: " << wdq_channel.m_max_raw_data; info_msg (os3.str().c_str()); } + if (g_debug) { std::ostringstream os4; os4 << " Scaled minimum: " << wdq_channel.m_min_scaled_data << @@ -285,7 +296,7 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool p WindaqFile::WindaqFile (const char* fname) - : m_fd(0), m_nChannels(0), m_nSamples(0), m_sample_rate(0), m_valid(false), + : m_valid(false), m_fd(0), m_nChannels(0), m_nSamples(0), m_sample_rate(0), m_strFile (fname) { } @@ -428,12 +439,10 @@ bool get_float8 (int fd, double& f) return true; } + bool WindaqChannel::read_channel_data () { - unsigned short int tmp2; - unsigned int tmp4; - int fd = r_wdq.m_fd; m_data = new signed short int [r_wdq.m_nSamples * 2]; @@ -455,14 +464,15 @@ WindaqChannel::read_channel_data () } m_units = units; - unsigned int row_bytes = 2 * r_wdq.m_nChannels; + long int row_bytes = 2 * r_wdq.m_nChannels; signed short int *sample_row = new signed short int [row_bytes]; signed short int* psample = &sample_row[m_channel - 1]; lseek (fd, r_wdq.m_nHeader_bytes, SEEK_SET); unsigned long int i; - signed short int data_max, data_min; + signed short int data_max = 0, data_min = 0; + double total_data = 0; for (i = 0; i < r_wdq.m_nSamples; i++) { if (read (fd, sample_row, row_bytes) != row_bytes) { std::ostringstream os; @@ -480,6 +490,7 @@ WindaqChannel::read_channel_data () signed short int value = v >> 2; m_data[i] = value; + total_data += value; if (i == 0) { data_max = value; @@ -497,6 +508,16 @@ WindaqChannel::read_channel_data () m_max_scaled_data = (m_slope * data_max) + m_intercept; m_min_scaled_data = (m_slope * data_min) + m_intercept; + if (! g_dont_demean) { + double dmean = total_data / static_cast(r_wdq.m_nSamples); + int mean = nearest(dmean); + std::cout << "Removing mean: " << (dmean * m_slope) + m_intercept << + " " << m_units << std::endl; + + for (i = 0; i < r_wdq.m_nSamples; i++) + m_data[i] -= mean; + } + delete sample_row; return true; } @@ -511,12 +532,20 @@ WavFile::WavFile (WindaqChannel& wdq_channel, const char* fname) m_nBitsPerSample = 16; m_nBytesPerSample = 2; m_rate = wdq_channel.r_wdq.m_sample_rate; - - double data_offset = -wdq_channel.m_min_scaled_data; - double data_scale = 0.; - if (wdq_channel.m_max_scaled_data != wdq_channel.m_min_scaled_data) - data_scale = 65535. / (wdq_channel.m_max_scaled_data - - wdq_channel.m_min_scaled_data); + + double data_offset = 0, data_scale = 0; + if (g_ignore_zero) { + data_offset = -wdq_channel.m_min_scaled_data; + if (wdq_channel.m_max_scaled_data != wdq_channel.m_min_scaled_data) + data_scale = 65535. / (wdq_channel.m_max_scaled_data - + wdq_channel.m_min_scaled_data); + } else { + double max_value = fabs(wdq_channel.m_max_scaled_data); + if (fabs (wdq_channel.m_min_scaled_data) > max_value) + max_value = fabs (wdq_channel.m_min_scaled_data); + if (max_value != 0.) + data_scale = 32767. / max_value; + } if (g_debug) { std::ostringstream os; @@ -543,8 +572,13 @@ WavFile::WavFile (WindaqChannel& wdq_channel, const char* fname) for (i = 0; i < m_nSamples; i++) { double value = input[i]; value = (slope * value) + intercept; - value = (value + data_offset) * data_scale; - value += 0.5 - 32768; + if (g_ignore_zero) { + value = (value + data_offset) * data_scale; + value += 0.5 - 32768; + } else { + value = value * data_scale; + } + signed short int v = static_cast(value); #if WORDS_BIG_ENDIAN unsigned char* p = reinterpret_cast(&v); @@ -626,9 +660,6 @@ WavFile::fill_header () bool WavFile::WriteFile () { - unsigned short int tmp2; - unsigned int tmp4; - if (! m_valid) return false; @@ -684,7 +715,7 @@ WavFile::Play () close(fd); return false; } - int channels = m_nChannels; + unsigned int channels = m_nChannels; if (ioctl (fd, SNDCTL_DSP_CHANNELS, &format) == -1) { error_msg ("Error setting number of channels"); close(fd); return false; @@ -694,7 +725,7 @@ WavFile::Play () close(fd); return false; } - int speed = static_cast(m_rate + 0.5); + unsigned int speed = static_cast(m_rate + 0.5); if (ioctl (fd, SNDCTL_DSP_SPEED, &speed) == -1) { error_msg ("Error setting sample rate"); close(fd); return false;