This is an example of how to use the AudioMasker class See the example file to work out how to use these Audio masking classes
/* * * This example shows how to use Dr M.R. Flax's (2000) hybrid * simultaneous audio masking class to find the masking threshold of a time domain signal. * * The compilation of this file is demonstrated in Makefile. * Run this file : ./AudioMaskerExample * View the results of this file using www.octave.org by running the script view.m * - simply type view once octave has started and you are in the suitable directory. * * The input audio should be stored in the file INPUTFILENAME in text format - each sample seperated by a * white space. * * ========================= HOWTO =============================== * \code * // First find the masking threshold * AudioMasker masker(sampleFreq, count); // Create the audio masker class using fs=sampleFreq and count filters * masker.excite(input, sampleCount); // find the mask for the array of input data which has sampleCount time samples. * * // Now do something with the masking threshold ... * * // The frequency domain mask is now located here * for (int j=0; j<count;j++) * masker.mask[j]; // This is the mask at each of the count frequencies of interest * * // A more sophisticated example - find the threshold for each Fourier bin * double fact=(double)sampleFreq/((double)sampleCount-1.0); // convert from an index to the equivalent * Fourier bin frequency * for (int j=0; j<halfSampleCount;j++){ * cout<<"finding for freq "<<j*fact<<'\t'; // The frequency we are inspecting * double threshold=masker.findThreshold(j*fact); // The masking threshold * 20*log10(threshold); // The threshold in decibels (dB) * } * * \endcode * // The following example calculates the spectral power and the masking threshold for each Fourier bin of interest ... */ #include <math.h> #include "AudioMasker.H" #define INPUTFILENAME "audio.44100.txt" // input file - text written samples seperated by white spaces #define POWFILENAME "fa.pow" // The power spectrum of the input signal #define THRESHFILENAME "thresh.dat" // The masking threshold at each frequency of the input signal #define TMASKFILENAME "fa.t.mask" // The masking threshold for each filter CF #define EXCITEFILENAME "fa.excite" // The excitation #include <fstream> int main(void){ // Setup many variables // The number of time domain samples int sampleCount=1024, halfSampleCount=(int)rint((double)sampleCount/2.0); // The filter bank count and sample frequency int count=50, sampleFreq=44100; // The number of time domain samples to skip before the sample of interest. int skip=8192-sampleCount-1; // The input array to hold the input time data double input[sampleCount]; // open the input file ifstream inputF(INPUTFILENAME); // Skip the first 2*'skip' samples. int temp; for (int i=0; i<skip;i++) inputF >> temp >> input[0]; // load sampleCount samples as the input to the algorithm for (int i=0; i<sampleCount;i++) inputF >> input[i]; inputF.close(); ofstream outputCF("cf.dat"); // central freq. output file ofstream outputT(TMASKFILENAME); ofstream outputP(POWFILENAME); // Input data Fourier power file // Get our masking function (class) ... AudioMasker masker(sampleFreq, count); //AudioMasker masker; // Can also be called like so with default filter banks and sampleFrequency masker.excite(input, sampleCount); // find the mask for (int j=0; j<count;j++){ // Output the central freq to file outputCF <<masker.pfb->cf[j]*((double)sampleCount/(double)sampleFreq)<<'\t'; outputT << 20*log10(masker.mask[j])<<'\t'; // output the mask for each filter CF to file } outputCF<<endl; outputT<<endl; realFFTData fftData(sampleCount); // Find the fourier transform for the output of the power to file realFFT fft(&fftData); // init the Fourier transform for (int j=0; j<sampleCount;j++) // load the time domain input to the Fourier transform fftData.in[j]=input[j]; fft.fwdTransform(); // Perform the transformation of the time domain to the frequency domain. fftData.compPowerSpec(); // Find the power spectrum for (int j=0; j<sampleCount/2;j++) // Output the power spectrum to file outputP<<20*log10(sqrt(fftData.power_spectrum[j]))<<'\t'; outputP<<endl; outputCF.close(); outputT.close(); outputP.close(); ofstream outputF(THRESHFILENAME); // Find and output the masking threshold for each Fourier bin in the power spectrum double fact=(double)sampleFreq/((double)sampleCount-1.0); // convert from an index to the equivalent Fourier bin frequency for (int j=0; j<halfSampleCount;j++){ // cout<<"finding for freq "<<j*fact<<'\t'; outputF<<20*log10(masker.findThreshold(j*fact))<<'\t'; } outputF<<endl; outputF.close(); }