23#include <Eigen/SparseCore>
24#include <unsupported/Eigen/FFT>
31#include <QElapsedTimer>
33#include <QtConcurrent>
51 signal.array() -= signal.mean();
52 QList<SpectogramInputData> lData;
53 int iThreadSize = QThread::idealThreadCount() * 2;
54 int iStepsSize = signal.rows() / iThreadSize;
55 int iResidual = signal.rows() % iThreadSize;
64 for (
int i = 0; i < iThreadSize; ++i) {
66 dataTemp.
iRangeHigh = i * iStepsSize + iStepsSize;
67 lData.append(dataTemp);
70 dataTemp.
iRangeLow = iThreadSize * iStepsSize;
71 dataTemp.
iRangeHigh = iThreadSize * iStepsSize + iResidual;
72 lData.append(dataTemp);
74 QFuture<MatrixXd> resultMat = QtConcurrent::mappedReduced(lData,
77 resultMat.waitForFinished();
80 return resultMat.result();
85VectorXd Spectrogram::gaussWindow(qint32 sample_count, qreal scale, quint32 translation)
87 VectorXd gauss = VectorXd::Zero(sample_count);
89 for (qint32 n = 0; n < sample_count; n++) {
90 qreal t = (qreal(n) - translation) / scale;
91 gauss[n] = exp(-3.14 * pow(t, 2)) * pow(sqrt(scale), (-1)) * pow(qreal(2), (0.25));
101#ifdef EIGEN_FFTW_DEFAULT
102 fftw_make_planner_thread_safe();
105 Eigen::FFT<double> fft;
107 VectorXd envelope, windowed_sig, real_coeffs;
108 VectorXcd fft_win_sig;
111 for (quint32 translate = inputData.
iRangeLow; translate < inputData.
iRangeHigh; translate++) {
112 envelope = gaussWindow(inputData.
vecInputData.rows(), window_size, translate);
114 windowed_sig = VectorXd::Zero(inputData.
vecInputData.rows());
115 fft_win_sig = VectorXcd::Zero(inputData.
vecInputData.rows());
117 windowed_sig = inputData.
vecInputData.array() * envelope.array();
119 fft.fwd(fft_win_sig, windowed_sig);
121 real_coeffs = fft_win_sig.segment(0, inputData.
vecInputData.rows() / 2).array().abs2();
123 tf_matrix.col(translate) = real_coeffs;
131void Spectrogram::reduce(MatrixXd& resultData,
132 const MatrixXd& data)
134 if (resultData.size() == 0) {
Gaussian-windowed short-time Fourier transform (STFT) spectrogram.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Input parameters for short-time Fourier transform spectrogram computation.
Eigen::VectorXd vecInputData
static Eigen::MatrixXd makeSpectrogram(Eigen::VectorXd signal, qint32 windowSize)