- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用 C++ 编写一个音乐可视化程序。它给出了音频输入的频谱。我使用 Aquila-dsp 获取音频样本,使用 Kiss-fft 进行 FFT,使用 SMFL 播放音频。输入格式为(.wav)。 OpenGL 用于绘制图形。
使用的算法:
1. *framePointer = 0, N = 10000;*
2. Load audio file and play it using SFML.
3. For *i* = framePointer to --> *framePointer* + *N* < *total_samples_count*
Collect audio samples.
4. Apply Window Function (Hann window)
5. Apply *FFT*
6. Calculate magnitude of first N/2 *FFT* data
*Magnitude* = sqrt( re * re + im * im)
7. Convert to dB(log) scale (optional)
10*log(magnitude)
8. Plot N/2, log(magnitude) values
9. If *framaPointer* >= *toatl_samples_count - N*
Exit
Else go to step 3.
#define N 10000
int framePointer = 0;
void getData()
{
int i,j,x;
Aquila::WaveFile wav(fileName);
double mag[N/2];
double roof = wav.getSamplesCount();
//Get first N samples
for( i = framePointer, j = 0; i < (framePointer + N)
&& framePointer < roof - N ; i++,j++ ){
//Apply window function on the sample
double multiplier = 0.5 * (1 - cos(2*M_PI*j/(N-1)));
in[j].r = multiplier * wav.sample(i);
in[j].i = 0; //stores N samples
}
if(framePointer < roof-N -1){
framePointer = i;
}
else {
printf("Frame pointer > roof - N \n");
printf("Framepointer = %d\n",framePointer );
//get total time and exit
timestamp_t t1 = get_timestamp();
double secs = (t1 - tmain) / 1000000.0L;
std::cout<<"Program exit.\nTotal time: "<<secs<<std::endl;
exit(0);
}
// Apply FFT
getFft(in,out);
// calculate magnitude of first N/2 FFT
for(i = 0; i < N/2; i++ ){
mag[i] = sqrt((out[i].r * out[i].r) + (out[i].i * out[i].i));
graph[i] = log(mag[i]) *10;
}
}
我使用 OpenGL 绘制图表。 Full source code
我遇到的问题是在选择帧长度(N 值)时。
对于具有一定长度的音频:
Length: 237191 ms
Sample frequency: 44100 Hz
Channels: 2
Byte rate: 172 kB/s
Bits per sample: 16b
如果我选择 N = 10000,图表将与音频同步。或者至少它会在音频结束时停止。
如何选择 N(帧长)以使音频与频谱同步。音频是双 channel 的,这个算法适用吗?
最佳答案
首先确定您希望可视化工具更新的频率。假设我们希望它每秒更新 25 次(类似于电视或电影的帧速率)。这意味着每 1/25 秒或每 40 毫秒。在 44.1 kHz 的采样率下,这转换为 44100/25 = 1764 个样本。由于我们通常需要 2 的 FFT 大小的幂,因此让我们选择 N = 2048。
这给出了 44100/2048 = 21.5 Hz 的频率轴分辨率。如果你想要更高的分辨率,那么你可以重叠连续的 FFT 窗口,例如保持相同的更新率并重叠 50%,那么对于 10.75 Hz 的分辨率,您可以得到 N = 4096。
关于c++ - 如何将音频与功率谱同步并选择帧长度 AND(做 fft)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37415263/
我想知道是否可以在不使用模板的情况下使用 C++ 进行泛型编程。是否可以编写 C++ 中所有可用的库,这些库是使用模板编写的,而不使用模板。在 C++ 中是否有其他可用的模板替代方案? 我想知道是否可
目前我认为处理器只有两种状态:运行和不运行。如果它正在运行,它将使用其全部功能来处理任务。如果有多个进程,进程会共享一部分CPU。 算力如何分“份”?那么,假设一个 CPU 有 100 万个晶体管,如
据我所知,在信标发送的包中,它包含有关校准 Tx 功率(或测量功率 - 1 米处的功率值)的信息。我只是想知道为什么信标发送校准的 Tx 功率,而不是广播功率(信标从源发送的信号功率)。因为计算逻辑可
我将在我的网站上创建一个页面,其中包含大约 50 个表单。堆叠在 Accordion CSS 中。这会伤害计算机速度较慢的用户吗? 最佳答案 尽管我不知道您为什么要在一个页面上放置 50 个表单,但拥
Android 设备上的 NFC 场非常弱。与专用的非接触式阅读器相比,您需要在天线的准确位置放置另一个设备或标签,否则它无法读取。 有没有办法通过任何代码方式增加NFC芯片的磁场或功率输出? 谢谢
好吧,现在我正在尝试使用 Firefox、opera、chrome 支持的 CSS 渐变功能制作一个看起来很酷的表格。 它看起来不错,但它太落后了。当我向下滚动页面时,它非常滞后。即使在超快的计算机上
从数学、算法和元编程递归的角度来看,我有一个具有挑战性的问题。考虑以下声明: template using ratio_power = /* to be defined */; 基于 std::rat
我是一名优秀的程序员,十分优秀!