Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
1年前关闭。
Improve this question
我想显示通过本地频率内容在每个部分进行颜色编码的音频波形。基本上可以说是Serato / Traktor或任何其他DJ软件的工作,您可以在其中查看声音并确定那里的频率。看起来像这样:
因此,从本质上讲,我将执行FFT以获取我指定的任何bin宽度的频率,但是没有人可以引用我一些对实际绘制有用的代码(最好是c)吗?
这将为您提供RGB阵列,您可以在放大和缩小波形显示时放大和缩小。缩放时,您可能希望对相邻帧的RGB值求平均值,以提供整体 View 。
我希望这有帮助。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
1年前关闭。
Improve this question
我想显示通过本地频率内容在每个部分进行颜色编码的音频波形。基本上可以说是Serato / Traktor或任何其他DJ软件的工作,您可以在其中查看声音并确定那里的频率。看起来像这样:
因此,从本质上讲,我将执行FFT以获取我指定的任何bin宽度的频率,但是没有人可以引用我一些对实际绘制有用的代码(最好是c)吗?
最佳答案
这次让我们尝试一个真实的答案。 :-)
这个问题太复杂了,无法为该空间中的所有代码提供完整的解决方案,但是我将使用伪代码,并假设您有一些可以对样本块进行窗口处理并计算FFT的库。
这类似于建立波形显示。在构建波形显示时,您可以确定在当前缩放级别上有多少个样本“适合”到一个水平像素中,在给定您的X滚动位置的情况下它们将从此处开始,计算该段的最小和最大样本值,并为您提供该波形像素的最小/最大Y位置。 (这实际上有点简化,我已经回写了波形渲染代码,但这是一个很好的近似值。)
要使用频率为波着色,您需要使用短时FFT和较小的色箱对波数据进行处理,并为每个色箱确定主要频率,然后将其映射到频谱上从红色到紫色的颜色。
假设您的音频样本位于名为samples
的数组中,这是伪代码。
// sample rate
float fS = 44100;
// size of frame for analysis, you may want to play with this
float frameMsec = 10;
// samples in a frame
int frameSamples = (int)(fS / (frameMsec * 1000));
// how much overlap each frame, you may want to play with this one too
int overlapSamples = (frameSamples / 2);
// number of samples in the sound file
int numSamples = ...;
// input array of samples
float inSamples[] = ...;
// color to use for each frame
RGB outColors[] = new float[(numSamples / frameOverlap) + 1];
// scratch buffers
float tmpWindow[frameSamples];
float tmpFFT[frameSamples];
// helper function to apply a windowing function to a frame of samples
void calcWindow(float* dst, const float* src, int size);
// helper function to compute FFT
void fft(float* dst, const float* src, int size);
// find the index of array element with the highest absolute value
// probably want to take some kind of moving average of buf[i]^2
// and return the maximum found
int maxFreqIndex(const float* buf, int size);
// map a frequency to a color, red = lower freq -> violet = high freq
RGB freqToColor(int i);
for (int i = 0, outptr = 0; i < numSamples; i += frameOverlap, outptr++)
{
// window another frame for FFT
calcWindow(tmpWindow, &inSamples[i], frameSamples);
// compute the FFT on the next frame
fft(tmpFFT, tmpWindow, frameSamples);
// which frequency is the highest?
int freqIndex = maxFreqIndex(tmpFFT, frameSamples);
// map to color
outColor[outptr] = freqToColor(freqIndex);
}
这将为您提供RGB阵列,您可以在放大和缩小波形显示时放大和缩小。缩放时,您可能希望对相邻帧的RGB值求平均值,以提供整体 View 。
我希望这有帮助。
关于audio - 通过频率编码波形颜色的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30366924/
10-12 13:25