Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование библиотеки FFTW (быстрое преобразова, Преобразование происходит неверно 
:(
    Опции темы
Vezd
  Дата 18.6.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2011

Репутация: нет
Всего: нет



Мне надо использовать библиотеку FFTW. Сайт с примером. Я написал код, основанный на примере с сайта. Мне надо с помощью БПФ получить АЧХ синусоидального сигнала. Входные данные - комплексные значения. Поэтому используется массивы double[] fin, fout;
в которых fin[i*2] - действительное число, fin[i * 2 + 1] - мнимое число. Но как я понял т.к. у меня синусоидальный сигнал то мнимая часть должна быть равна нулю, т.е. fin[i * 2 + 1] = 0

Я написал следующий код:

Код

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using fftwlib;

namespace fure
{
public class fftwtest
{
    //pointers to unmanaged arrays
    IntPtr pin, pout;

    //managed arrays
    double[] fin, fout;

    //pointers to the FFTW plan objects
    public IntPtr fplan1, fplan2;

    // Initializes FFTW and all arrays
    // n: Logical size of the transform
    public void InitFFTW(int n)
    {
        //create two unmanaged arrays, properly aligned
        pin = fftwf.malloc(n * 8);
        pout = fftwf.malloc(n * 8);

        //create two managed arrays, possibly misalinged
        //n*2 because we are dealing with complex numbers
        fin = new double[n*2];
        fout = new double[n*2];

        double T = 0.0000159;//длительность сигнала
        double F = 345000; //частота сигнала
        double F_d = 6250000;//частота дискретизации

        n = (int)(T * F_d);

        //fill our arrays with a sawtooth signal
        for (int i = 0; i < n; i++)
        {
            fin[i*2] = 5 * Math.Sin(2 * Math.PI * F * i/F_d);
            fin[i * 2 + 1] = 0;
        }
        //copy managed arrays to unmanaged arrays
        Marshal.Copy(fin, 0, pin, n*2 );

        //create a few test transforms
        fplan1 = fftwf.dft_1d(n, pin, pout, fftw_direction.Forward, fftw_flags.Estimate); 
    }
    // Tests a single plan, displaying results
    //plan: Pointer to plan to test
    public void TestPlan(IntPtr plan, int n)
    {
        fftwf.execute(plan);

        Marshal.Copy(pout, fout, 0, n * 2);
        Console.WriteLine(fout[30]);
    }
    // Releases all memory used by FFTW/C#
    public void FreeFFTW()
    {
        //it is essential that you call these after finishing
        //may want to put the initializers in the constructor
        //and these in the destructor
        fftwf.free(pin);
        fftwf.free(pout);
        fftwf.destroy_plan(fplan1);
    }
}
class Program
{
    static void Main(string[] args)
    {
        double T = 0.0000159;//длительность сигнала
        double F_d = 6250000;//частота дискретизации
        int n = (int)(T * F_d);

        fftwtest test = new fftwtest();
        test.InitFFTW(n);
        test.TestPlan(test.fplan1, n);

        Console.ReadLine();
    }
}
}

Выходной массив fout. Но в этом массиве получаются какие то огромные значения, при возведении которых в квадрат получается бесконечность. Где может быть ошибка?



Это сообщение отредактировал(а) Vezd - 19.6.2011, 15:33
PM MAIL   Вверх
Vezd
Дата 19.6.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2011

Репутация: нет
Всего: нет



Нашел ошибку, надо вместо double использовать float как в примере.
PM MAIL   Вверх
jorikdima
Дата 29.6.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Для понимания. АЧХ это хорактеристика цепи. Если речь про сигнал, правильнее говорить "спектр сигнала".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1009 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.