5 : dftParams{winSizeInSamples, fftSize, hopSize, winSizeInSamples - hopSize, sampleRate}, m_mode(mode),
6 m_fft(static_cast<int>(log2f(static_cast<float>(fftSize)))), sigFrame(2 * fftSize),
8 m_sigFrame(2 * fftSize)
29 auto inputData = buffer.getReadPointer(0);
31 std::vector<std::vector<float>> outputData;
44 for (
int i = 0; i < frameEnd - posin; ++i)
53 std::vector<float> frameOutput;
72 outputData.push_back(std::move(frameOutput));
96 for (
int i = 0; i < frameEnd - posin; ++i)
109 m_fft.performFrequencyOnlyForwardTransform(
sigFrame.data(),
false);
119 m_fft.performRealOnlyForwardTransform(
sigFrame.data(),
false);
139 int numOfFrames =
static_cast<int>(stftMatrix.size());
140 jassert(numOfFrames > 0);
145 std::vector<float> outputData(outputSize, 0.0f);
151 for (
const auto& specFrame : stftMatrix)
154 m_fft.performRealOnlyInverseTransform(
const_cast<float*
>(specFrame.data()));
159 if (posout + i < outputSize)
161 outputData[posout + i] += specFrame[i];
172 const std::vector<std::vector<float>>& stftMatrix)
175 auto numOfFrames = stftMatrix.size();
177 auto imageWidth = image.getWidth();
178 auto imageHeight = image.getHeight();
180 jassert(imageWidth > 0 && imageHeight > 0);
182 float factor = (
static_cast<float>(numOfFrames)) / (
static_cast<float>(imageWidth));
184 for (
int x = 0; x < imageWidth; x++)
186 int frameIndex =
static_cast<int>(factor *
static_cast<float>(x));
188 jassert(frameIndex <= numOfFrames);
190 for (
auto y = 1; y < imageHeight; ++y)
193 juce::FloatVectorOperations::findMinAndMax(stftMatrix.at(frameIndex).data(),
dftParams.
fftSize);
196 auto skewedProportionY = 1.0f - std::exp(std::log((
float)y / (
float)imageHeight) *
m_scalingConstant);
198 auto fftDataIndex = (size_t)jlimit(
204 auto level = jmap( stftMatrix.at(frameIndex).at(fftDataIndex),
206 jmax(maxLevel.getEnd(), 1e-5f),
210 image.setPixelAt(x, y, Colour::fromHSV(level, 1.0f, level, 1.0f));
220 float halfRes = freqRes / 2;
241 Eigen::VectorXf binsVector =
finalGrid(w1, Nyq,
false , freqRange);
242 std::vector<float> binsVectorSTL(binsVector.data(), binsVector.data() + binsVector.size());
244 return binsVectorSTL;
252 float halfRes = freqRes / 2;
273 return finalGrid(w1, Nyq,
false , freqRange);
284 Eigen::ArrayXf colOffsets = Eigen::ArrayXf::LinSpaced(nCol, 0, (nCol - 1) *
dftParams.
hopSize);
286 std::vector<float> columnsSTL(columns.data(), columns.data() + columns.size());
299 Eigen::ArrayXf colOffsets = Eigen::ArrayXf::LinSpaced(nCol, 0, (nCol - 1) *
dftParams.
hopSize);
315 if (
static_cast<int>(NPTS) % 2 != 0)
346 Eigen::VectorXf temp(negEndPt * 2);
347 temp.head(negEndPt) = w1.segment(1, negEndPt).reverse();
348 temp.tail(negEndPt) = w1.head(negEndPt);
362 Eigen::VectorXf temp(negEndPt * 2);
363 temp.head(negEndPt) = w1.segment(1, negEndPt).reverse();
368 w(w.size() - 1) = Nyq / 2;
374 throw std::runtime_error(
"Unsupported frequency range.");
std::vector< float > generateWindow(int sizeInSamples, WindowType windowType)
Definition WindowFunctions.cpp:12
Eigen::VectorXf generateWindowEigen(int sizeInSamples, WindowType windowType)
Definition WindowFunctions.cpp:49
Definition AirAbsorptionFilter.cpp:2
WindowType
Definition WindowFunctions.h:6