20 size_t windowSize,
unsigned stepsPerWindow,
21 bool leadingPadding,
bool trailingPadding )
22: mWindowSize{ windowSize }
23, mSpectrumSize{ 1 + mWindowSize / 2 }
24, mStepsPerWindow{ stepsPerWindow }
25, mStepSize{ mWindowSize / mStepsPerWindow }
26, mLeadingPadding{ leadingPadding }
27, mTrailingPadding{ trailingPadding }
28, hFFT{
GetFFT(mWindowSize) }
29, mFFTBuffer( mWindowSize )
30, mInWaveBuffer( mWindowSize )
31, mOutOverlapBuffer( mWindowSize )
32, mNeedsOutput{ needsOutput }
88 -> std::unique_ptr<Window>
90 return std::make_unique<Window>(windowSize);
113 for (
auto &pWindow :
mQueue)
154 const float *buffer,
size_t len )
159 while (success && len &&
175 if ( (success = processor(*
this)), success )
193 int oldLen =
mQueue.size();
194 mQueue.resize(queueLength);
195 for (
size_t ii = oldLen; ii < queueLength; ++ii)
209 *pFFTBuffer++ = *pInWaveBuffer++ * *pInWindow++;
212 memmove(pFFTBuffer, pInWaveBuffer,
mWindowSize *
sizeof(
float));
216 auto &record =
Nth(0);
220 float *pReal = &record.mRealFFTs[1];
221 float *pImag = &record.mImagFFTs[1];
222 int *pBitReversed = &
hFFT->BitReversed[1];
224 for (
size_t ii = 1; ii < last; ++ii) {
225 const int kk = *pBitReversed++;
231 record.mRealFFTs[0] = dc;
234 record.mImagFFTs[0] = nyquist;
245 bool bLoopSuccess =
true;
253 while (bLoopSuccess &&
267 auto allocSize =
mQueue.size();
272 if (
size < allocSize)
273 return size.as_size_t();
287 const float *pReal = &record.
mRealFFTs[1];
288 const float *pImag = &record.
mImagFFTs[1];
292 *pBuffer++ = *pReal++;
293 *pBuffer++ = *pImag++;
306 auto pBitReversed = &
hFFT->BitReversed[0];
307 for (
size_t jj = 0; jj < last; ++jj) {
308 auto kk = *pBitReversed++;
315 auto pBitReversed = &
hFFT->BitReversed[0];
316 for (
size_t jj = 0; jj < last; ++jj) {
317 auto kk = *pBitReversed++;
347 if (!
Start(queueLength))
353 bool bLoopSuccess =
true;
354 auto samplePos = start;
355 while (bLoopSuccess && samplePos < start + len) {
359 start + len - samplePos);
362 channel.
GetFloats(buffer.data(), samplePos, blockSize);
363 samplePos += blockSize;
364 bLoopSuccess =
ProcessSamples(processor, buffer.data(), blockSize);
void NewWindowFunc(int whichFunction, size_t NumSamplesIn, bool extraSample, float *in)
void RealFFTf(fft_type *buffer, const FFTParam *h)
void InverseRealFFTf(fft_type *buffer, const FFTParam *h)
HFFT GetFFT(size_t fftlen)
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
bool Append(constSamplePtr buffer, sampleFormat format, size_t len)
bool GetFloats(float *buffer, sampleCount start, size_t len, fillFormat fill=FillFormat::fillZero, bool mayThrow=true, sampleCount *pNumWithinClips=nullptr) const
"narrow" overload fetches from the unique channel
size_t GetBestBlockSize(sampleCount t) const
A hint for sizing of well aligned fetches.
size_t GetMaxBlockSize() const
A Track that contains audio waveform data.
void Clear(double t0, double t1) override
double GetEndTime() const override
Implement WideSampleSequence.
double LongSamplesToTime(sampleCount pos) const
Positions or offsets within audio files need a wide type.
void rotate(const float *oldPhase, const float *newPhase, std::complex< float > *dst, int32_t n)