// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Thu Feb 14 07:20:44 PST 2002 // Last Modified: Sun Jan 19 09:23:59 EST 2003 (added peak amplitude) // Last Modified: Fri Jan 24 00:09:30 PST 2003 (added formating options) // Last Modified: Thu Aug 26 17:41:01 PDT 2004 (changed sqrt(2) to sqrt(2.0)) // Last Modified: Sun Aug 29 03:33:21 PDT 2004 (updated for compiling in GCC3) // Filename: ...soundfile/examples/sndpower.cpp // Syntax: C++ // // Description: Calculate the average signal power for given durations // #include "soundfile.h" #include <stdlib.h> #include <math.h> #ifndef OLDCPP #include <iostream> using namespace std; #else #include <iostream.h> #endif #ifndef OLDCPP #include <iostream> #include <iomanip> using namespace std; #else #include <iostream.h> #include <iomanip.h> #endif void printLongSummary(SoundFileRead& soundfile, int totalframes, int start, int chunk); int main(int argc, char** argv) { Options options; options.define("a|average=i:10000", "Number of samples to average over"); options.define("s|start=i:0", "Starting sample"); options.define("n|count=i:-1", "Number of analyses to make"); options.define("all=b", "calculate the energy of the entire file"); options.define("q|quiet=b", "suppress printing of header info"); options.process(argc, argv); if (options.getArgCount() == 0) { cout << "Usage: " << options.getCommand() << " filename" << endl; exit(1); } SoundFileRead soundfile(options.getArg(1)); int chunk = options.getInteger("average"); int start = options.getInteger("start"); int totalframes = options.getInteger("count"); if (totalframes <= 0) { totalframes = (soundfile.getSamples() - start)/chunk + 1; } // print header information if (!options.getBoolean("quiet")) { cout << "; Filename = " << options.getArg(1) << "\n"; cout << "; Samples = " << soundfile.getSamples() << "\n"; if (start != 0) { cout << "; Starting sample = " << start << "\n"; } cout << "; Averaging size = " << chunk << " samples" << "\n"; cout << "; Total frames = " << totalframes << "\n"; cout << "; start-sample dB RMS peak\n"; } if (options.getBoolean("all")) { printLongSummary(soundfile, 1, 0, soundfile.getSamples()); } else { printLongSummary(soundfile, totalframes, start, chunk); } return 0; } ////////////////////////////// // // printLongSummary -- // void printLongSummary(SoundFileRead& soundfile, int totalframes, int start, int chunk) { double sum, value, db, rms, peak; int i, j, channel; for (i=0; i<totalframes; i++) { sum = 0.0; cout << i * chunk << ":\t"; for (j=0; j<chunk; j++) { for (channel=0; channel < soundfile.getChannels(); channel++) { value = soundfile.getCurrentSampleDouble(channel); sum += value * value; } soundfile.incrementSample(); } if (sum == 0.0) { db = -1000; } else { db = 10.0 * log10(sum/chunk/soundfile.getChannels()); } rms = sqrt(sum/chunk/soundfile.getChannels()); peak = sqrt(2.0) * rms; cout << db << '\t' << rms << '\t' << peak << "\n"; } } // md5sum: 5a53e4c5bd02e63d794c066cf9642a72 sndpower.cpp [20050403]