TEST (LowPassFilterTest, WorksOnRepetitiveWaves) { // make two sine waves, but this time, several seconds long unsigned int samples = frameRate * 5; KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(samples); for (unsigned int i = 0; i < samples; i++) { float sample = 0.0; sample += sine_wave(i, highFrequency, frameRate, magnitude); // high freq sample += sine_wave(i, lowFrequency, frameRate, magnitude); // low freq a.setSample(i, sample); // ensure repetition of sine waves is perfect... if (i >= frameRate) { ASSERT_NEAR(a.getSample(i), a.getSample(i - frameRate), tolerance); } } KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; lpf->filter(a, w); delete lpf; // test for lower wave only for (unsigned int i = 0; i < samples; i++) { float expected = sine_wave(i, lowFrequency, frameRate, magnitude); ASSERT_NEAR(expected, a.getSample(i), tolerance); } }
TEST(AudioDataTest, SamplesBasic){ KeyFinder::AudioData a; a.addToSampleCount(100); ASSERT_EQ(100, a.getSampleCount()); // init values for(int i=0; i<100; i++){ ASSERT_EQ(0.0, a.getSample(i)); } a.setSample(0, 10.0); ASSERT_EQ(10.0, a.getSample(0)); }
TEST (AudioDataTest, SampleMutatorBounds) { KeyFinder::AudioData a; a.addToSampleCount(5); ASSERT_THROW(a.getSample(-1), KeyFinder::Exception); ASSERT_THROW(a.getSample(5), KeyFinder::Exception); ASSERT_THROW(a.setSample(-1, 1.0), KeyFinder::Exception); ASSERT_THROW(a.setSample(5, 1.0), KeyFinder::Exception); ASSERT_THROW(a.setSample(0, INFINITY), KeyFinder::Exception); ASSERT_THROW(a.setSample(0, NAN), KeyFinder::Exception); }
TEST (AudioDataTest, FrameMutator) { KeyFinder::AudioData a; a.setChannels(4); a.addToFrameCount(5); ASSERT_EQ(5, a.getFrameCount()); ASSERT_EQ(20, a.getSampleCount()); a.setSample(6, 10.0); ASSERT_FLOAT_EQ(10.0, a.getSample(6)); ASSERT_FLOAT_EQ(10.0, a.getSampleByFrame(1, 2)); a.setSampleByFrame(1, 2, 20.0); ASSERT_FLOAT_EQ(20.0, a.getSample(6)); ASSERT_FLOAT_EQ(20.0, a.getSampleByFrame(1, 2)); }
TEST (AudioDataTest, SliceFromBack) { KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(1); KeyFinder::AudioData* b = NULL; KeyFinder::AudioData* nullPtr = NULL; ASSERT_THROW(b = a.sliceSamplesFromBack(1), KeyFinder::Exception); ASSERT_EQ(nullPtr, b); a.addToFrameCount(10); ASSERT_THROW(b = a.sliceSamplesFromBack(11), KeyFinder::Exception); ASSERT_EQ(nullPtr, b); a.resetIterators(); float v = 0; while (a.writeIteratorWithinUpperBound()) { a.setSampleAtWriteIterator(v); a.advanceWriteIterator(); v += 1.0; } ASSERT_NO_THROW(b = a.sliceSamplesFromBack(5)); ASSERT_NE(nullPtr, b); ASSERT_EQ(5, a.getSampleCount()); ASSERT_EQ(5, b->getSampleCount()); ASSERT_FLOAT_EQ(5.0, b->getSample(0)); ASSERT_FLOAT_EQ(9.0, b->getSample(4)); delete b; }
TEST (AudioDataTest, SampleInitialisation) { KeyFinder::AudioData a; a.addToSampleCount(100); ASSERT_EQ(100, a.getSampleCount()); // init values for (int i = 0; i < 100; i++) { ASSERT_FLOAT_EQ(0.0, a.getSample(i)); } }
TEST (AudioDataTest, DownsamplerResamplesNonintegralRelationship) { KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(100); a.addToSampleCount(12); for (unsigned int i = 0; i < 5; i++) a.setSample(i, 100.0); for (unsigned int i = 5; i < 10; i++) a.setSample(i, 500.0); for (unsigned int i = 10; i < 12; i++) a.setSample(i, 1000.0); a.downsample(5); ASSERT_EQ(3, a.getSampleCount()); ASSERT_FLOAT_EQ(100.0, a.getSample(0)); ASSERT_FLOAT_EQ(500.0, a.getSample(1)); // this doesn't make total mathematical sense but I'm taking a shortcut for performance ASSERT_FLOAT_EQ(1000.0, a.getSample(2)); }
TEST (AudioDataTest, MakeMono) { KeyFinder::AudioData a; a.setChannels(2); a.addToSampleCount(20); for (int i = 0; i < 10; i++) { a.setSample(i * 2, 100.0); } a.reduceToMono(); ASSERT_EQ(10, a.getSampleCount()); for (int i = 0; i < 10; i++) { ASSERT_FLOAT_EQ(50.0, a.getSample(i)); } }
TEST (AudioDataTest, DownsamplerResamplesIntegralRelationship) { KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(100); a.addToSampleCount(10); for (unsigned int i = 0; i < 5; i++) a.setSample(i, 100.0); for (unsigned int i = 5; i < 10; i++) a.setSample(i, 500.0); a.downsample(5); ASSERT_EQ(20, a.getFrameRate()); ASSERT_EQ(2, a.getSampleCount()); ASSERT_FLOAT_EQ(100.0, a.getSample(0)); ASSERT_FLOAT_EQ(500.0, a.getSample(1)); }
TEST (LowPassFilterTest, KillsHigherFreqs) { // make a high frequency sine wave, one second long KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frameRate); for (unsigned int i = 0; i < frameRate; i++) { a.setSample(i, sine_wave(i, highFrequency, frameRate, magnitude)); } KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; lpf->filter(a, w); delete lpf; // test for near silence for (unsigned int i = 0; i < frameRate; i++) { ASSERT_NEAR(0.0, a.getSample(i), tolerance); } }
TEST (LowPassFilterTest, MaintainsLowerFreqs) { // make a low frequency sine wave, one second long KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frameRate); for (unsigned int i = 0; i < frameRate; i++) { a.setSample(i, sine_wave(i, lowFrequency, frameRate, magnitude)); } KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; lpf->filter(a, w); delete lpf; // test for near perfect reproduction for (unsigned int i = 0; i < frameRate; i++) { float expected = sine_wave(i, lowFrequency, frameRate, magnitude); ASSERT_NEAR(expected, a.getSample(i), tolerance); } }
TEST(AudioDataTest, Frames){ KeyFinder::AudioData a; a.addToSampleCount(4); ASSERT_THROW(a.getSample(0,0), KeyFinder::Exception); a.setChannels(2); ASSERT_EQ(0.0, a.getSample(0,0)); ASSERT_EQ(0.0, a.getSample(0,1)); ASSERT_THROW(a.getSample(-1, 0), KeyFinder::Exception); ASSERT_THROW(a.getSample(-1, 1), KeyFinder::Exception); ASSERT_THROW(a.getSample( 2, 0), KeyFinder::Exception); ASSERT_THROW(a.getSample( 2, 1), KeyFinder::Exception); ASSERT_THROW(a.getSample( 0,-1), KeyFinder::Exception); ASSERT_THROW(a.getSample( 0, 2), KeyFinder::Exception); a.setSample(0,0, 10.0); ASSERT_EQ(10.0, a.getSample(0,0)); a.setSample(1,0, 20.0); ASSERT_EQ(20.0, a.getSample(2)); }
TEST (LowPassFilterTest, DoesBothAtOnce) { // make two sine waves, one second long KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frameRate); for (unsigned int i = 0; i < frameRate; i++) { float sample = 0.0; sample += sine_wave(i, highFrequency, frameRate, magnitude); // high freq sample += sine_wave(i, lowFrequency, frameRate, magnitude); // low freq a.setSample(i, sample); } KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; lpf->filter(a, w); delete lpf; // test for lower wave only for (unsigned int i = 0; i < frameRate; i++) { float expected = sine_wave(i, lowFrequency, frameRate, magnitude); ASSERT_NEAR(expected, a.getSample(i), tolerance); } }
TEST (AudioDataTest, DownsamplerResamplesSineWave) { unsigned int frameRate = 10000; unsigned int frames = frameRate * 4; float freq = 20; float magnitude = 32768.0; unsigned int factor = 5; KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frames); for (unsigned int i = 0; i < frames; i++) a.setSample(i, sine_wave(i, freq, frameRate, magnitude)); a.downsample(factor); unsigned int newFrameRate = frameRate / factor; unsigned int newFrames = frames / factor; ASSERT_EQ(newFrameRate, a.getFrameRate()); ASSERT_EQ(newFrames, a.getSampleCount()); for (unsigned int i = 0; i < newFrames; i++) ASSERT_NEAR(sine_wave(i, freq, newFrameRate, magnitude), a.getSample(i), magnitude * 0.05); }
TEST (AudioDataTest, SampleMutator) { KeyFinder::AudioData a; a.addToSampleCount(1); a.setSample(0, 10.0); ASSERT_FLOAT_EQ(10.0, a.getSample(0)); }