void EffectNoiseRemoval::ProcessSamples(sampleCount len, float *buffer) { int i; while(len && mOutSampleCount < mInSampleCount) { int avail = wxMin(len, mWindowSize - mInputPos); for(i = 0; i < avail; i++) mInWaveBuffer[mInputPos + i] = buffer[i]; buffer += avail; len -= avail; mInputPos += avail; if (mInputPos == mWindowSize) { FillFirstHistoryWindow(); if (mDoProfile) GetProfile(); else RemoveNoise(); RotateHistoryWindows(); // Rotate halfway for overlap-add for(i = 0; i < mWindowSize / 2; i++) { mInWaveBuffer[i] = mInWaveBuffer[i + mWindowSize / 2]; } mInputPos = mWindowSize / 2; } } }
bool EffectNoiseRemoval::ProcessOne(int count, WaveTrack * track, longSampleCount start, sampleCount len) { bool retCode = true; sampleCount s = 0; sampleCount idealBlockLen = track->GetMaxBlockSize() * 4; if (idealBlockLen % windowSize != 0) idealBlockLen += (windowSize - (idealBlockLen % windowSize)); float *buffer = new float[idealBlockLen]; float *window1 = new float[windowSize]; float *window2 = new float[windowSize]; float *thisWindow = window1; float *lastWindow = window2; int i; for(i=0; i<windowSize; i++) { lastWindow[i] = 0; smoothing[i] = float(0.0); } while((s < len)&&((len-s)>(windowSize/2))) { sampleCount block = idealBlockLen; if (s + block > len) block = len - s; track->Get((samplePtr) buffer, floatSample, start + s, block); for(i=0; i<(block-windowSize/2); i+=windowSize/2) { int wcopy = windowSize; if (i + wcopy > block) wcopy = block - i; int j; for(j=0; j<wcopy; j++) thisWindow[j] = buffer[i+j]; for(j=wcopy; j<windowSize; j++) thisWindow[j] = 0; if (mDoProfile) GetProfile(windowSize, thisWindow); else { //TIDY-ME: could we just test mLevel=<0 in CheckWhetherSkipEffect? if (mLevel > 0) { // Skip NoiseRemoval if zero ... may apply for CleanChain RemoveNoise(windowSize, thisWindow); for(j=0; j<windowSize/2; j++) { buffer[i+j] = thisWindow[j] + lastWindow[windowSize/2 + j]; } } } float *tempP = thisWindow; thisWindow = lastWindow; lastWindow = tempP; } // Shift by half-a-window less than the block size we loaded // (so that the blocks properly overlap) block -= windowSize/2; if (!mDoProfile) track->Set((samplePtr) buffer, floatSample, start + s, block); s += block; if (TrackProgress(count, s / (double) len)) { retCode = false; break; } } delete[] buffer; delete[] window1; delete[] window2; return retCode; }
bool EffectNoiseRemoval::ProcessOne(int count, WaveTrack * t, sampleCount start, sampleCount len) { sampleCount s = start; sampleCount idealBlockLen = t->GetMaxBlockSize() * 4; if (idealBlockLen % windowSize != 0) idealBlockLen += (windowSize - (idealBlockLen % windowSize)); sampleType *buffer = new sampleType[idealBlockLen]; sampleType *window1 = new sampleType[windowSize]; sampleType *window2 = new sampleType[windowSize]; sampleType *thisWindow = window1; sampleType *lastWindow = window2; sampleCount originalLen = len; int i; for(i=0; i<windowSize; i++) { lastWindow[i] = 0; smoothing[i] = 0.0; } while(len) { int block = idealBlockLen; if (block > len) block = len; t->Get(buffer, s, block); for(i=0; i<block; i+=windowSize/2) { int wlen = i + windowSize; int wcopy = windowSize; if (i + wcopy > block) wcopy = block - i; int j; for(j=0; j<wcopy; j++) thisWindow[j] = buffer[i+j]; for(j=wcopy; j<windowSize; j++) thisWindow[j] = 0; if (doProfile) GetProfile(windowSize, thisWindow); else { RemoveNoise(windowSize, thisWindow); for(j=0; j<windowSize/2; j++) buffer[i+j] = thisWindow[j] + lastWindow[windowSize/2 + j]; } sampleType *tempP = thisWindow; thisWindow = lastWindow; lastWindow = tempP; } if (len > block && len > windowSize/2) block -= windowSize/2; if (!doProfile) t->Set(buffer, s, block); len -= block; s += block; TrackProgress(count, (s-start)/(double)originalLen); } delete[] buffer; delete[] window1; delete[] window2; return true; }
bool EffectWaveletDenoise::ProcessOne(int count, WaveTrack * t, sampleCount start, sampleCount len) { sampleCount s = start; sampleCount idealBlockLen = t->GetMaxBlockSize() * 4; if (idealBlockLen % windowSize != 0) idealBlockLen += (windowSize - (idealBlockLen % windowSize)); float *buffer = new float[idealBlockLen]; float *window1 = new float[windowSize]; float *window2 = new float[windowSize]; float *thisWindow = window1; float *lastWindow = window2; sampleCount originalLen = len; int i; bool first = true; for(i=0; i<windowSize; i++) { lastWindow[i] = 0; } while(len) { sampleCount block = idealBlockLen; if (block > len) block = len; t->Get(buffer, s, block); for(i=0; i<block; i+=windowSize/2) { int wlen = i + windowSize; int wcopy = windowSize; if (i + wcopy > block) wcopy = block - i; int j; for(j=0; j<wcopy; j++) thisWindow[j] = buffer[i+j]; for(j=wcopy; j<windowSize; j++) thisWindow[j] = 0; RemoveNoise(windowSize, thisWindow, first); first = false; for(j=0; j<windowSize/2; j++) buffer[i+j] = thisWindow[j] + lastWindow[windowSize/2 + j]; float *tempP = thisWindow; thisWindow = lastWindow; lastWindow = tempP; } if (len > block && len > windowSize/2) block -= windowSize/2; t->Set(buffer, s, block); len -= block; s += block; TrackProgress(count, (s-start)/(double)originalLen); } delete[] buffer; delete[] window1; delete[] window2; return true; }
bool EffectNoiseRemoval::ProcessOne(int count, WaveTrack * track, longSampleCount start, sampleCount len) { sampleCount s = 0; sampleCount idealBlockLen = track->GetMaxBlockSize() * 4; if (idealBlockLen % windowSize != 0) idealBlockLen += (windowSize - (idealBlockLen % windowSize)); float *buffer = new float[idealBlockLen]; float *window1 = new float[windowSize]; float *window2 = new float[windowSize]; float *thisWindow = window1; float *lastWindow = window2; int i; for(i=0; i<windowSize; i++) { lastWindow[i] = 0; smoothing[i] = float(0.0); } while((s < len)&&((len-s)>(windowSize/2))) { sampleCount block = idealBlockLen; if (s + block > len) block = len - s; track->Get((samplePtr) buffer, floatSample, start + s, block); for(i=0; i<(block-windowSize/2); i+=windowSize/2) { int wcopy = windowSize; if (i + wcopy > block) wcopy = block - i; int j; for(j=0; j<wcopy; j++) thisWindow[j] = buffer[i+j]; for(j=wcopy; j<windowSize; j++) thisWindow[j] = 0; if (doProfile) GetProfile(windowSize, thisWindow); else { RemoveNoise(windowSize, thisWindow); for(j=0; j<windowSize/2; j++) buffer[i+j] = thisWindow[j] + lastWindow[windowSize/2 + j]; } float *tempP = thisWindow; thisWindow = lastWindow; lastWindow = tempP; } // Shift by half-a-window less than the block size we loaded // (so that the blocks properly overlap) block -= windowSize/2; if (!doProfile) track->Set((samplePtr) buffer, floatSample, start + s, block); s += block; if (TrackProgress(count, s / (double) len)) return false; } delete[] buffer; delete[] window1; delete[] window2; return true; }