Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/56: Рейтинг темы: голосов - 56, средняя оценка - 4.91
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
1

Подключение библиотеки fftw. Преобразование Фурье.

17.11.2013, 22:48. Просмотров 10881. Ответов 17
Метки нет (Все метки)


Приветствую. Есть необходимость использовать быстрое преобразование Фурье. Скачал библиотеку , покурил мануалы и понял, что без помощи не разберусь. Как подключить библиотеку к борланд с++ 6, Может кто сталкивался уже?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2013, 22:48
Ответы с готовыми решениями:

Неправильное преобразование при использовании библиотеки FFTW
Мне надо использовать библиотеку FFTW. Сайт с примером. Я написал код, основанный на примере с...

Найти коэффиценты разложения в ряд Фурье, используя быстрое преобразование Фурье (БПФ)
Прошу помочь мне в нелеггкой задачке нужно для заданной на периоде 2∏ функции f(x) найти...

Преобразование звукового сигнала в спектр (Фурье-преобразование)
Доброго времени суток! Мне необходимо преобразовать звуковой файл в спектр, а как и с чего начать...

Подключение lib-файла FFTW для сборки проекта для android из OSX
Привет всем! Я только новичек в QT, не судите строго) Собираю проект под Android с OSX....

17
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
17.11.2013, 23:22 2
В данном случае тебе надо сгенерить из def -> lib под C++Builder.
Либо забить и вызывать ф-ции из DLL динамически ...

В утилиту Implib через командную строку передается сначала имя создаваемого файла импортируемой библиотеки, а затем имя файла описания. Например:

Код
Implib.exe VCLIB.lib VCLIB.def
Созданный файл .lib можно статически связывать с проектом C++Builder.
В целом, как видим, статическое связывание библиотек, созданных в разных системах, сопряжено с определенными сложностями. Так что надежнее всего использовать в этих случаях динамическое связывание. Тем более, что этот вариант имеет и ряд других преимуществ, описанных в предыдущих разделах.
Архангельский "Приемы программирование в С++ Builder6 и 2006"


DLL в C++Builder и Microsoft Visual C++
1
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
18.11.2013, 13:02  [ТС] 3
Что-то не получается. Написал батник (может в нем ошибка?), который из "деф" делает "либ".
Bash
1
2
3
4
5
chcp 866
"C:\Program Files (x86)\Borland\CBuilder6\Bin\implib.exe" -a FFTW3-3.lib "C:\fttw3\libfftw3-3.def"
"C:\Program Files (x86)\Borland\CBuilder6\Bin\implib.exe" -a FFTW3F-3.lib "C:\fttw3\libfftw3f-3.def"
"C:\Program Files (x86)\Borland\CBuilder6\Bin\implib.exe" -a FFTW3l-3.lib "C:\fttw3\libfftw3l-3.def"
pause
А он мне в ответ:
Подключение библиотеки fftw. Преобразование Фурье.

Я так понял он ждет на входе dll. Указал расширение dll, запустил, вроде без ошибок, либы создались. Кидаю либы, дллки и заголовочный файл в папку с проектом. В билдере через "Add to project" добавляю либы, в опциях добавляю пути к дллкам, дописываю в проекте #include <fftw3.h>, а он ругается на этот инклюд при компилировании (Unable to open include file).
0
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
18.11.2013, 13:09  [ТС] 4
Implib.exe пробовал с ключем "-a", как написано в мануале на сайте библиотеки , так и без ключа, как написано у Вас. Результат все равно как на картинке.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
18.11.2013, 15:00 5
Хз, походу говорит что def -не корректен
В нем внутри идет название dll
Код
LIBRARY libfftw3f-3.dll
EXPORTS
fftwf_alignment_of
...
Название "libfftw3f-3.dll" содержит "-", вероятно из-за этого, можно попробовать поубирать "-" и переименовать DLL- ки соответвтвенно

Цитата Сообщение от Avazart Посмотреть сообщение
Либо забить и вызывать ф-ции из DLL динамически ...
1
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
18.11.2013, 18:49  [ТС] 6
Занялся динамическим вызовом, но и тут проблемы
Накатал код подключения дллки, вроде работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
       typedef void __cdecl(*dll_func)(void);
 
        dll_func Func = NULL;
        HMODULE hDLL = LoadLibrary("libfftw3-3.dll");
        if(!hDLL)
                cout << "Impossible to load library" << endl;
        else    cout << "success load lib" << endl;
 
        Func = (dll_func)GetProcAddress(hDLL, "fftw_plan_r2r_1d");
        if(!Func)
                cout << "Impossible to find function" << endl;
        else    cout << "success find function" << endl;
Но как передавать в функцию fftw_plan_r2r_1d свои параметры?
Согласно мануалу, функция выглядит так:
fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out, fftw_r2r_kind kind, unsigned flags)
Как мне объявлять переменные типа "fftw_plan"? Они же определены только в самой библиотеке. Пробовал в typedef прописывать такие же переменные вместо void, но компиль ругается.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
18.11.2013, 19:01 7
Цитата Сообщение от Selot Посмотреть сообщение
Как мне объявлять переменные типа "fftw_plan"?
Хедер библиотеки подключи что была видна структура fftw_plan

Добавлено через 2 минуты
C++
1
2
3
4
typedef fftw_plan
     (__cdecl *DLL_fftw_plan_r2r_1d)(int n, double *in, double *out, fftw_r2r_kind kind, unsigned flags);
 
//...
1
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
22.04.2014, 12:36 8
Ровно такая же беда. Скачал, сконвертировал, подключил - не работает.

Прям открываю консольку, подключаю заголовочник, добавляю в проект сконвертированные либы, запихиваю официальный пример, все собирается без ошибок, но при запуске падает с ошибкой, что не может найти библиотеку:
Подключение библиотеки fftw. Преобразование Фурье.


Архивы для скачивания
Сам архив со всеми потрохами последней версии: fftw334.rar

Нашел так же предыдущую версию: fftw312.rar

Архив со стандартными борландовыми программами преобразований форматов библиотек: implib_and_coff2omf.rar
(_b - builder6, _r - rad xe2)

Уже преобразованные к борландовому виду либы: lib_b.rar


Прошу помощи.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
22.04.2014, 14:23 9
XE3, вроде работает c созданием с помощью implib -c -a.
Но неплохо бы иметь более сложный пример нежели данный оф пример.
2
Вложения
Тип файла: zip test fftw334.zip (3.18 Мб, 83 просмотров)
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
22.04.2014, 14:50 10
Вот вроде нашел пример который делает вроде что-то чудовещное:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <complex>
#include "fftw3.h"
#pragma comment (lib,"libfftw3-3.dll.lib")
#pragma comment (lib,"libfftw3f-3.dll.lib")
#pragma comment (lib,"libfftw3l-3.dll.lib")
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject* Sender)
{
    int N= 10;
 
    std::complex<double> *in= new std::complex<double>[N];
    std::complex<double> *out= new std::complex<double>[N];
 
    fftw_plan p= fftw_plan_dft_1d(N, reinterpret_cast<fftw_complex*>(in),
            reinterpret_cast<fftw_complex*>(out), FFTW_FORWARD, FFTW_ESTIMATE);
    double pi= acos(-1.);
    for (int i= 0; i< N; i++)
        in[i]= sin(2* pi* 0.2* i);
 
    fftw_execute(p);
 
    for (int i= 0; i< N; i++)
    {
        RichEdit1->Lines->Add(  String(out[i].real())+" + "+
                                                        String(out[i].imag())+"j"
                                                    );
    }
 
    fftw_destroy_plan(p);
    delete[]in;
    delete[]out;
}
// ---------------------------------------------------------------------------
Взято отСелЯ FFTw библиотека, пример использования?


Еще натолкнулся на такой ресурс https://parallel.ru/cluster/fftw.html может будет полезен.
Ссылка на доку http://www.fftw.org/fftw3.pdf
1
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
22.04.2014, 16:03 11
Avazart, большое спасибо. Нечто чудовищное и доку видал, ресурс почитаю. Но только после того, как запущу эту хренобазу. Это какое-то дьявольское колдунство: ваш проект запускается, а собираю точно такой же свой (хоть с вашими библиотеками, хоть со своими, со всеми наборами ключей) и он показывает мне ровно тот же самый кукиш.
0
Вложения
Тип файла: rar TempProject.rar (2.71 Мб, 48 просмотров)
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
22.04.2014, 16:10 12
Дай угадаю, dll положили в папку с проектом, а не в Win32/Release ?

В настойках проекта в опции Debug в рабочую папку нужно ставить в "."
1
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
22.04.2014, 16:27 13
Цитата Сообщение от Avazart Посмотреть сообщение
Дай угадаю, dll положили в папку с проектом, а не в Win32/Release ?
Именно так.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
22.04.2014, 16:45 14
Project Options / Debugger / Work Dirrectory = "."
0
Миниатюры
Подключение библиотеки fftw. Преобразование Фурье.  
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
22.04.2014, 21:41 15
Matlab vs FFTW. FFT
Программы на C# из книги Смита по ЦОС. FFTW
2
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
23.04.2014, 00:43 16
Смотрю документацию и найти не могу. Эта библиотека умеет делать обратное преобразования Фурье (т.е. из Фурье свертки восстановить первоначальную ф-цию), интересует 2D случай?
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,390
Записей в блоге: 29
23.04.2014, 01:37 17
Еще раз https://parallel.ru/cluster/fftw.html (рус)

Для построения многомерного плана (вместо приставки fftw_ используется fftwnd_, где n размерность) используются функции:

fftwnd_plan fftw2d_create_plan(int nx, int ny, fftw_direction dir, int flags) - для двумерного БПФ;
fftwnd_plan fftw3d_create_plan(int nx, int ny, int nz, fftw_direction dir, int flags) - для трехмерного БПФ.
1
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
23.04.2014, 02:20 18
Avazart, спасибо. Просто искал отдельную ф-ция, а там оказывается просто флажок.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2014, 02:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Быстрое преобразование Фурье и ошибка "Неявное преобразование типа"
А подскажите еще по одной прблемке: Есть программа реализующая БПФ (ну должна по крайней мере это...

Подключение библиотеки Crypto. Если возможно, нужна ссылка на скачивание данной библиотеки
Возникли сложности с подключением библиотеки Crypto: import Crypto.Cipher.AES Выдает...

Преобразование Фурье
Вот такой пример: есть синусоида (один период длительностью 1сек) с амплитудой=1 как разбить...

Преобразование Фурье
Есть программа в которую нужно добавить Преобразование Фурье, и вывести результат в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.