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
bool IsLeader() const 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)