在短时间傅里叶变换中获取特定频率的值

时间:2015-07-17 12:27:20

标签: c++ matlab audio fft

我正在尝试使用C ++重新创建Matlab使用的spectrogram函数。该函数使用Short Time Fourier Transform(STFT)。我找到了一些执行STFT的C ++代码here。代码似乎适用于所有频率,但我只想要一些。我发现this发布了类似问题的帖子,其中包含以下答案:

  

使用复数指数来获取数据的内积   感兴趣的频率。如果g是您的数据,那么只需替换   f您想要的频率值(例如,1,3,10,......)

没有数学背景,我无法弄清楚如何做到这一点。内部产品部分看起来很简单Wikipedia page,但我完全不知道他的意思(关于DFT的公式)

  

感兴趣频率的复指数

有人可以解释我怎么能做到这一点? STFT之后的数据结构是一个填充了复数的矩阵。我只是不知道如何提取我想要的频率。

相关功能,其中Matrix<complex<double>> ShortTimeFourierTransform::Calculate(const vector<double> &signal, const vector<double> &window, int windowSize, int hopSize) { int signalLength = signal.size(); int nOverlap = hopSize; int cols = (signal.size() - nOverlap) / (windowSize - nOverlap); Matrix<complex<double>> results(window.size(), cols); int chunkPosition = 0; int readIndex; // Should we stop reading in chunks? bool shouldStop = false; int numChunksCompleted = 0; int i; // Process each chunk of the signal while (chunkPosition < signalLength && !shouldStop) { // Copy the chunk into our buffer for (i = 0; i < windowSize; i++) { readIndex = chunkPosition + i; if (readIndex < signalLength) { // Note the windowing! data[i][0] = signal[readIndex] * window[i]; data[i][1] = 0.0; } else { // we have read beyond the signal, so zero-pad it! data[i][0] = 0.0; data[i][1] = 0.0; shouldStop = true; } } // Perform the FFT on our chunk fftw_execute(plan_forward); // Copy the first (windowSize/2 + 1) data points into your spectrogram. // We do this because the FFT output is mirrored about the nyquist // frequency, so the second half of the data is redundant. This is how // Matlab's spectrogram routine works. for (i = 0; i < windowSize / 2 + 1; i++) { double real = fft_result[i][0]; double imaginary = fft_result[i][1]; results(i, numChunksCompleted) = complex<double>(real, imaginary); } chunkPosition += hopSize; numChunksCompleted++; } // Excuse the formatting, the while ends here. return results; } 是汉明,所需频率的矢量还不是输入,因为我不知道如何处理它们:

{{1}}

1 个答案:

答案 0 :(得分:1)

查找Goertzel algorithmfilter示例代码,该代码使用内积的计算等价物与复指数来测量信号中特定固定正弦频率的存在或大小。性能或分辨率取决于滤波器的长度和信号。