我使用这段代码来计算一个短时傅里叶变换:
// Output pre-allocation
std::vector<std::vector<std::complex<T> > > y(nFft, std::vector<std::complex<T> >(nFrames, 0.0));
std::vector<T> xt;
std::vector<std::complex<T> > yt;
xt.reserve(nFft);
yt.reserve(nFft);
#pragma omp parallel for private(xt,yt)
for (unsigned int t = 0; t < nFrames; ++t) {
const int offset = -((int) wSize/2) + t*nHop;
// Extract frame of input data
if (offset < 0) {
xt.assign(x.begin(), x.begin() + offset + wSize);
xt.resize(wSize, 0.0);
}
else if (offset + wSize > n) {
xt.assign(x.begin() + offset, x.end());
xt.resize(wSize, 0.0);
}
else
xt.assign(x.begin() + offset, x.begin() + offset + wSize);
// Apply window to current frame
std::transform(xt.begin(), xt.end(), w.begin(), xt.begin(), std::multiplies<T>());
// Zero padding
std::rotate(xt.begin(), xt.begin() + wSize/2, xt.end());
xt.insert(xt.begin() + wSize/2, nFft - wSize, 0.0);
yt = fft(xt); // Perform the FFT!
#pragma omp critical
{
for (unsigned int f = 0; f < nFft; ++f)
y[f][t] = yt[f];
}
}在不牺牲可读性的情况下,无论是在设计风格上还是在性能上,我都可以改进吗?当然,重点是提高我的编码技能,而不使用任何外部库!
关于xt和yt向量,我将它们放在循环之外,以提高单线程(当OpenMP被禁用时)的性能。在多线程中,每个线程都会被复制(因此使用了私有关闭)。
发布于 2011-12-19 16:34:43
唯一值得评论的是标识符名称可能更有意义。
https://codereview.stackexchange.com/questions/6980
复制相似问题