Неправильное масштабирование в рекурсивной реализации ОБПФ ⇐ C++
Неправильное масштабирование в рекурсивной реализации ОБПФ
Я работаю над простой реализацией рекурсивного БПФ/ОБПФ на C++. Код следующий:
#include #include #include #include #include #include "assert.hpp" шаблон std::valarray fft(std::valarray const& data) { const auto N = data.size(); ASSERT(!(N & (N - 1)), "Длина БПФ должна быть степенью двойки"); если (N == 1) возврат данных; auto даже = fft(data[std::slice(0, N / 2, 2)]); auto нечетный = fft(data[std::slice(1, N / 2, 2)]); автоматический результат = std::valarray(N); для (size_t k = 0; k < N/2; ++k) { auto t = std::exp(std::complex(0, -2 * std::numbers::pi * T(k) / N)); результат[k] = четный[k] + нечетный[k] * t; результат[k + N/2] = четный[к] - нечетный[к] * т; } вернуть результат; } шаблон std::valarray ifft(std::valarray const& data) { const auto N = data.size(); ASSERT(!(N & (N - 1)), "Длина БПФ должна быть степенью двойки"); если (N == 1) возврат данных; auto Even = ifft(data[std::slice(0, N / 2, 2)]); auto нечетное = ifft(data[std::slice(1, N / 2, 2)]); автоматический результат = std::valarray(N); для (size_t k = 0; k < N/2; ++k) { auto t = std::exp(std::complex(0, 2 * std::numbers::pi * T(k) / N)); результат[k] = (чётный[k] + нечетный[k] * t) / T(N); результат[k + N / 2] = (четный[k] - нечетный[k] * t)/T(N); } вернуть результат; } Хотя прямое БПФ работает нормально, обратное БПФ неправильно масштабирует выходные данные (на 1/8 для БПФ размера 8). Я использую этот код для проверки своей реализации:
std::valarray data = { 3, 5, 8, 9, 1, 4, 7, 2 }; std::cout
Я работаю над простой реализацией рекурсивного БПФ/ОБПФ на C++. Код следующий:
#include #include #include #include #include #include "assert.hpp" шаблон std::valarray fft(std::valarray const& data) { const auto N = data.size(); ASSERT(!(N & (N - 1)), "Длина БПФ должна быть степенью двойки"); если (N == 1) возврат данных; auto даже = fft(data[std::slice(0, N / 2, 2)]); auto нечетный = fft(data[std::slice(1, N / 2, 2)]); автоматический результат = std::valarray(N); для (size_t k = 0; k < N/2; ++k) { auto t = std::exp(std::complex(0, -2 * std::numbers::pi * T(k) / N)); результат[k] = четный[k] + нечетный[k] * t; результат[k + N/2] = четный[к] - нечетный[к] * т; } вернуть результат; } шаблон std::valarray ifft(std::valarray const& data) { const auto N = data.size(); ASSERT(!(N & (N - 1)), "Длина БПФ должна быть степенью двойки"); если (N == 1) возврат данных; auto Even = ifft(data[std::slice(0, N / 2, 2)]); auto нечетное = ifft(data[std::slice(1, N / 2, 2)]); автоматический результат = std::valarray(N); для (size_t k = 0; k < N/2; ++k) { auto t = std::exp(std::complex(0, 2 * std::numbers::pi * T(k) / N)); результат[k] = (чётный[k] + нечетный[k] * t) / T(N); результат[k + N / 2] = (четный[k] - нечетный[k] * t)/T(N); } вернуть результат; } Хотя прямое БПФ работает нормально, обратное БПФ неправильно масштабирует выходные данные (на 1/8 для БПФ размера 8). Я использую этот код для проверки своей реализации:
std::valarray data = { 3, 5, 8, 9, 1, 4, 7, 2 }; std::cout
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение