Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2015, 10:26   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Запуск библиотеки FFT C#

Решил я воспользоваться этой библиотекой, хочу сначала просто сделать БПФ на любое число выборок любого сигнала.

http://www.fftw.org/install/windows.html
http://www.fftw.org/fftw2_doc/fftw_2.html

Я знаю, как подключить к проекту dll и добавить h-файл. Теперь мне надо понять, как будет выглядеть основной код для этой задачи.

У меня к Вам 2 вопроса.
1. Я вообще программирую с помощью Windows Forms, поэтому в идеале я жду простейший вариант кода, либо подскажите хоть как-то, чтобы разобраться, что писать.

2. Я посмотрел примеры, ориентируюсь на ссылки выше, но нашел только код
Код:
#include <fftw.h>
...
{
     fftw_complex in[N], out[N];
     fftw_plan p;
     ...
     p = fftw_create_plan(N, FFTW_FORWARD, FFTW_ESTIMATE);
     ...
     fftw_one(p, in, out);
     ...
     fftw_destroy_plan(p);  
}
Может быть, Вы знаете, как сделать хотя бы консольное приложение, возможно на основе этого кода, которое бы могло из одного массива данных с помощью БПФ получать другой массив?
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 12:22   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Нашел, как это уже делали. http://ru.stackoverflow.com/question...80%D1%8C%D0%B5

Проблема в том, что я запустил этот проект, понял, что в fin входные данные, в fout - выходные. Я решил перенести это в свой проект. Все заступорилось с подключения библиотеки. Смотрите, я добавил библиотеку fftwlib.dll в проект, написал "embedded resource", затем ищу в Reference fftwlib и не могу найти. В проекте пишу строчку
Код:
using fftwlib;
, так компилятор не может понять, откуда взять fftwlib. Подскажите, как я могу хотя бы успешно подключить эту библиотеку к себе в проект? Почему может не получаться?
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 13:09   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насколько я помню, сборки подключаются так:
Безымянный.jpg
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.10.2015, 13:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Лично я вам несколько раз, что не надо сборки добавлять как файлы в проект или как ресурсы. Используйте меню для референсов.
2. Либа с http://www.fftw.org - это действительно просто либа, не сборка
3. Вы в первом посте ссылаетесь на нативную либу, а во втором сетуете, что взяли код из примера использования обертки либы, а обертку не взяли

Может вам начать с чего-нибудь попроще?..
p51x вне форума Ответить с цитированием
Старый 14.10.2015, 14:18   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Я долго мучался, и в итоге библиотеку он видит. Через референсы и добавляю, но проблема в том, что когда я переносил dll в корень проекта, среда Visual его не видела в референсах. Проблема была в том, что я хотел добавить через Reference, но не мог найти библиотеки, которую надо добавить. Ну ок.
Посмотрите, пожалуйста, пример, я руководствовался ссылкой, которую указал выше, но я не знаю, как из консольного приложения переписать windows forms. Что мне надо изменить в исходном коде, чтобы у себя не иметь ошибок и тп. Когда я, например, скопипастил класс public class FFTWtest перед стандартным классом windows forms, начало писать ошибки по поводу дальнейшей инициализации windows forms.

Я просто еще не соображаю, где брать классы и примеры, чтобы использовать функции из dll. На математическом уровне-то все ясно - мне сейчас надо сделать просто входной и выходной массивы, на входе пилу, например, подать входной сигнал на обработку библиотеке FFTW, и результат записать в выходной массив. А вот подробнее - я вообще не знаю, с чего начать, с каких функций! Даже этот пример меня не очень пока вдохновил, не могу продвинуться http://forum.sources.ru/index.php?showtopic=368270

Следующий код я переосмыслил и записал к себе в приложение Windows Forms
Код:
int n = 16348; float [] fin = new float[n * 2]; float [] fout = new float[n * 2];
                for (i = 0; i < n * 2; i++) fin[i] = i % 50;
                for (i = 0; i < n * 2; i++) fout[i] = i % 50;
                IntPtr pin = fftwf.malloc(n * 8); IntPtr pout = fftwf.malloc(n * 8);
                
                IntPtr fplan1 = fftwf.dft_1d(n, pin, pout, fftw_direction.Forward, fftw_flags.Estimate);
                
                fftwf.execute(fplan1);
                double a = 0, b = 0, c = 0;
                fftwf.flops(fplan1, ref a, ref b, ref c);
                Marshal.Copy(fin, 0, pin, n * 2); Marshal.Copy(fout, 0, pout, n * 2);
Проблема в том, что возникает Exception для строчки
Код:
IntPtr pin = fftwf.malloc(n * 8); IntPtr pout = fftwf.malloc(n * 8);
Почему это может происходить?
Вложения
Тип файла: zip fft_maker.zip (417.0 Кб, 10 просмотров)

Последний раз редактировалось Stilet; 14.10.2015 в 15:42.
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 15:40   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
Я долго мучался, и в итоге библиотеку он видит. Через референсы и добавляю, но проблема в том, что когда я переносил dll в корень проекта, среда Visual его не видела в референсах. Проблема была в том, что я хотел добавить через Reference, но не мог найти библиотеки, которую надо добавить. Ну ок.
Вы читаете, что вам пишут? Это не СБОРКА, это НАТИВНАЯ ЛИБА.

Посмотрите на https://github.com/tszalay/FFTWSharp...arp/Interop.cs
Обратите внимание на всякие там DllImport...
p51x вне форума Ответить с цитированием
Старый 14.10.2015, 16:02   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

ООО, я просто 2 dll добавил, которые в вашей сборке были указаны, и у меня перестало выдавать ошибку!! Серьезно что ли? А как правильно тогда вообще эту сборку в проект добавлять? Получается, Reference здесь нужна не на dll, а на проект FFTWSharp, который я должен добавить в свой проект? Кстати, здесь попроще код http://ru.stackoverflow.com/question...81-idisposable

Последний раз редактировалось Krasi; 14.10.2015 в 16:05.
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 16:10   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Уже ближе, тогда что у меня в коде может быть неверно сейчас? Это от начала до конца операция БПФ, и исходные данные, и выходные можете видеть.
Код:
IntPtr pin, pout;
                int n = 16348; float [] fin = new float[n * 2]; float [] fout = new float[n * 2];
                
                pin = fftwf.malloc(n * 8); pout = fftwf.malloc(n * 8);
                fin = new float[n * 2]; fout = new float[n * 2];

                for (i = 0; i < n * 2; i++)
                    fin[i] = i % 50;

                
                //copy managed arrays to unmanaged arrays
                Marshal.Copy(fin, 0, pin, n * 2);

 
                IntPtr fplan1 = fftwf.dft_1d(n, pin, pout, fftw_direction.Forward, fftw_flags.Estimate);
                
                fftwf.execute(fplan1);
                double a = 0, b = 0, c = 0;
                fftwf.flops(fplan1, ref a, ref b, ref c);

                this.Controls["richTextBox2"].Text = fin[80].ToString();

                fftwf.free(pin);
                fftwf.free(pout);
                fftwf.destroy_plan(fplan1);
fin, вроде, пила, но вот хочу я вместо fin вывести fout - выдает 0, а по-логике у меня результат должен быть в pout. Может что-то не дописал? Массив fout просто заполнен нулями.

Последний раз редактировалось Krasi; 14.10.2015 в 16:13.
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 16:30   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Во, вот с этой строчкой заработало
Код:
Marshal.Copy(pout, fout, 0, n * 2);
Krasi вне форума Ответить с цитированием
Старый 14.10.2015, 16:34   #10
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Теперь вопрос попроще. Чтобы протестировать работу этого кода, я хочу использовать гармонический сигнал. И тут я забыл, что синус выдает double, а мне надо float.
Код:
fin[i * 2] = 5 * Math.Sin(2 * Math.PI * 10 * i / 100);
Что я могу сделать?
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск многопоточной DLL библиотеки shalva1234 C# (си шарп) 1 16.07.2014 09:17
FFT asdbsa Visual C++ 3 22.09.2013 21:39
Частота и амплитуда FFT WorldMaster C# (си шарп) 17 16.12.2012 17:58
Проблема с БПФ (FFT) Teddy_bear Общие вопросы C/C++ 2 13.01.2012 18:13