【发布时间】:2020-12-02 14:34:56
【问题描述】:
所以我正在编写一个节拍检测算法,它工作起来很酷,但它会检测每个节拍(鼓、语音、踩镲等)。 而且我试图只采用踩镲节拍声音。 这是代码的一部分,我正在使用 FFT 并尝试对其进行过滤:
for (int channel = 0; channel < numChannels; ++channel) {
for (int j = k * smallbuf_samples; j < (k + 1) * smallbuf_samples; ++j) {
smallbuffer[channel].push_back(bigbuffer[channel][j]);
}
}
fftw_complex x[smallbuf_samples];
fftw_complex y[smallbuf_samples];
for (int i = 0; i < smallbuf_samples; ++i) {
x[i][REAL] = smallbuffer[0][i];
x[i][IMAG] = smallbuffer[1][i];
}
fftw_plan plan = fftw_plan_dft_1d(smallbuf_samples, x, y, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
fftw_cleanup();
std::vector<double> b;
for (int i = 80; i < smallbuf_samples; ++i) {
y[i][REAL] = 0;
y[i][IMAG] = 0;
}
for (int i = 0; i < smallbuf_samples; ++i) {
b.push_back(y[i][REAL] * y[i][REAL] + y[i][IMAG] * y[i][IMAG]);
}
for (int i = 0; i < smallbuf_samples / very_smallbuf_samples; ++i) {
double sum = 0;
int j;
for (j = i*(i+1)/2 * 108/13 + 22/13; j < (i+1)*(i+2)/2 * 108/13 + 22/13 && j < smallbuf_samples; ++j) {
sum += b[j];
}
Es[k].push_back((float) (j - (i*(i+1)/2 * 108/13 + 22/13)) / (float) smallbuf_samples * sum);
}
for (int channel = 0; channel < numChannels; ++channel) {
smallbuffer[channel].clear();
}
所以,如您所见,我通过将所有高于 80 的 y 样本索引设置为 0 来过滤它(因为踩镲的频率约为 300..3000 Hz)。 虽然,我的节拍算法检测语音、鼓和其他节拍。 如何解决它,我做错了什么?
【问题讨论】:
标签: c++ audio filter fft frequency-analysis