11.17. Вычисление быстрого преобразования Фурье
11.17. Вычисление быстрого преобразования Фурье
Проблема
Требуется выполнить эффективный расчет дискретного преобразования Фурье (ДПФ), используя алгоритм быстрого преобразования Фурье (БПФ).
Решение
Программный код примера 11.33 обеспечивает базовую реализацию БПФ.
Пример 11.33. Реализация БПФ
#include <iostream>
#include <complex>
#include <cmath>
#include <iterator>
using namespace std;
unsigned int bitReverse(unsigned int x, int log2n) {
int n = 0;
int mask = 0x1;
for (int i=0; i < log2n; i++) {
n <<= 1;
n |= (x & 1);
x >>= 1;
}
return n;
}
const double PI = 3.1415926536;
template<class Iter_T>
void fft(Iter_r a, Iter_r b, int log2n) {
typedef typename iterator_traits<Iter T>::value_type complex;
const complex J(0, 1);
int n = 1 << log2n;
for (unsigned int i=0; i < n; ++i) {
b[bitReverse(i, log2n)] = a[i];
}
for (int s = 1; s <= log2n; ++s) {
int m = 1 << s;
int m2 = m >> 1;
complex w(1, 0);
complex wm = exp(-J * (PI / m2));
for (int j=0; j < m2; ++j) {
for (int k=j; k < n; k += m) {
complex t = w * b[k + m2];
complex u = b[k];
b[k] = u + t;
b[k + m2] = u - t;
}
w *= wm;
}
}
}
int main() {
typedef complex<double> cx;
cx a[] = { cx(0, 0), cx(1, 1), cx(3, 3), cx(4, 4),
cx(4, 4), cx(3, 3), cx(1, 1), cx(0, 0) };
cx b[8];
fft(a, b, 3);
for (int i=0; i<8; ++i) cout << b[i] << " ";
}
Программа примера 11.33 выдает следующий результат.
(16,16)
(-4.82843,-11.6569)
(0,0)
(-0.343146,0.828427)
(0.0)
(0.828427,-0.343146)
(0,0)
(-11.6569,-4.82843)
Обсуждение
Преобразование Фурье играет важную роль в спектральном анализе и часто используется в технических и научных приложениях. БПФ — это алгоритм вычисления ДПФ, который имеет сложность порядка N log2(N) в отличие от ожидаемой сложности N? для простой реализации ДПФ. Такое впечатляющее ускорение достигается в БПФ благодаря устранению избыточных вычислений.
Очень не просто найти хорошую реализацию БПФ, написанную на «правильном» C++ (т. е. когда программа на C++ не является механическим переложением алгоритмов, написанных на Фортране или С) и которая не была бы защищена сильно ограничивающей лицензией. Представленный в примере 11.33 программный код основан на открытом коде, который можно найти в сетевой конференции Usenet, посвященной цифровой обработке сигналов (comp.dsp). Большим преимуществом реализации БПФ на правильном C++ по сравнению с более распространенным решением в стиле С является то, что стандартная библиотека содержит шаблон complex, который позволяет существенно снизить объем необходимого программного кода. В представленной в примере 11.33 функции fft() основное внимание уделялось простоте, а не эффективности.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
DOM DocumentFragment: быстрее быстрого
DOM DocumentFragment: быстрее быстрого DocumentFragment является облегченным контейнером для DOM-узлов. Он описан в спецификации DOM1 и поддерживается во всех современных браузерах (был добавлен в Internet Explorer в 6-й версии).В спецификации говорится, что различные операции — например, добавление
Метод быстрого голосования
Метод быстрого голосования Все участники сидят за столом. Задачи рассматриваются последовательно. Для каждой задачи проводится краткое обсуждение, описываются возможные усложняющие факторы и возможная реализация. Затем участники опускают руку под стол и поднимают от 0
2.4. Ярлыки для быстрого выхода из системы и завершения работы
2.4. Ярлыки для быстрого выхода из системы и завершения работы В Windows Vista есть служебная программа – shutdown.ехе, которая позволяет выполнить выход из системы, выключение или перезагрузку компьютера. С помощью этой программы можно создать ярлыки для быстрого выполнения
Тактики быстрого запуска вирусной кампании
Тактики быстрого запуска вирусной кампании Метки: исследования, внимание, влияние, вирусное распространение, приманкиБлогосфера – социальная среда, и она пронизана устойчивыми связями на уровне постоянных читателей-блоггеров, у каждого из которых свои читатели. Умелая
23.2. Настройка быстрого вызова программ и папок
23.2. Настройка быстрого вызова программ и папок Быстрый вызов программ и папок с помощью запуска ярлыков сочетаниями клавиш также бывает очень удобным и экономит время.Сделать это достаточно просто. Для этого щелкните правой кнопкой мыши на ярлыке объекта, который вы
Утилита WebMultiSearcher – удобный инструмент для быстрого поиска
Утилита WebMultiSearcher – удобный инструмент для быстрого поиска Одна из удобных утилит, предназначенных для поиска данных в Интернете, называется WebMultiSearcher. Одним из ее преимуществ является то, что она распространяется бесплатно, дистрибутив программы в виде zip-архива можно
7. Ряды Фурье и гармонические составляющие
7. Ряды Фурье и гармонические составляющие Одна из сильных сторон PSpice заключается в способности анализировать системы с нелинейными характеристиками, например, исследовать усилитель мощности при подаче на его вход сигнала с высокой амплитудой. При этом усилитель
Панель быстрого запуска
Панель быстрого запуска Панель быстрого запуска находится в самом верху, рядом с Кнопкой «Office» (рис. 3.3). На нее можно (и нужно) помещать кнопки, которыми вы чаще всего пользуетесь. Рис. 3.3. Панель быстрого запуска У меня пока на ней кнопки Сохранить, Отменить и
9.1. Анализ Фурье
9.1. Анализ Фурье Программа PSPICE может также проводить анализы Фурье (спектральные анализы) и определять с их помощью частотные спектры заданных сигналов. В следующем разделе мы рассмотрим это на примере двух сигналов: сначала с прямоугольным симметричным переменным
Строка заголовка и панель быстрого доступа
Строка заголовка и панель быстрого доступа Строка заголовка находится в верхней части окна Microsoft Word. Несмотря на то что она занимает совсем немного места, ее функции достаточно важны. Во-первых, она показывает название программы, поэтому по ней можно сразу увидеть, с каким
Назначение макроса кнопке панели быстрого запуска
Назначение макроса кнопке панели быстрого запуска Если вам будет удобно вызывать макрос с панели быстрого доступа, то сделайте следующее.1. Нажмите кнопку кнопке в области Назначить макрос. Появится окно Параметры Word с открытым разделом Настройка (рис. 9.3). Рис. 9.3.
Панель быстрого доступа
Панель быстрого доступа Панель быстрого доступа – важный элемент интерфейса Word 2007, повышающий удобство работы пользователя.Внешне Панель быстрого доступа похожа на привычную инструментальную панель (рис. 2.2), присутствующую в прежних версиях программы: ее кнопки
Панель быстрого доступа
Панель быстрого доступа Панель быстрого доступа – это вспомогательная панель, расположенная справа от Кнопки «Office», на которую вы можете добавить кнопки и элементы управления, используемые наиболее часто. По умолчанию Панель быстрого доступа содержит всего три кнопки:
Клавиши быстрого доступа
Клавиши быстрого доступа Сейчас многие клавиатуры, кроме стандартных клавиш, имеют дополнительные, например для запуска Калькулятора, окна Компьютер, Проигрывателя Windows Media, Outlook Express и т. д. У меня именно такая клавиатура, но должен признаться, что очень долгое время я
Панель быстрого доступа
Панель быстрого доступа Наличие панели быстрого доступа в окне Photoshop CS4 сразу бросается в глаза, как и отсутствие привычной строки заголовка с названием программы. Панель быстрого доступа должна быть вам знакома, например, по программам пакета Microsoft Office 2007. Примечание При
4.2.5. Создание групп быстрого поиска
4.2.5. Создание групп быстрого поиска В группу быстрого поиска или смарт-группу заносится список контактных лиц, удовлетворяющий заданным критериям поиска Этот список будет постоянно обновляться по мере добавления в адресную книгу новых записей. Например, вы можете