Прогнозирование волны после БПФ с определенной фазой и частотой - PullRequest
1 голос
/ 17 июня 2019

Я использую скользящее окно для извлечения информации из моих данных ЭЭГ с помощью БПФ.Теперь я хочу предсказать сигнал из моего окна в следующее.Поэтому я извлекаю фазу из временного окна 0,25 секунды для прогнозирования следующего длинного окна 0,25 секунды.

Я новичок в обработке / прогнозировании сигналов, поэтому мои знания здесь немного устарели.

Я не могу генерировать синусоидальную волну с моей извлеченной фазой и частотой.Я просто не нахожу решение.Мне может просто понадобиться толчок в правильном направлении, кто знает.

Есть ли в R функция, которая помогает мне генерировать подходящую синусоидальную волну?

Итак, у меня есть максимальная частота с извлеченной фазой, и мне нужно генерировать волну с этой информацией.

1 Ответ

0 голосов
/ 17 июня 2019

здесь псевдокод для синтеза синусоидальной кривой выбранной частоты ... в настоящее время он предполагает начальный фазовый сдвиг нуля, поэтому просто измените значение тета, если вам нужен другой начальный фазовый сдвиг

func pop_audio_buffer(number_of_samples float64, given_freq float64,
    samples_per_second float64) ([]float64, error) {

    // output sinusoidal curve is assured to both start and stop at the zero cross over threshold,
    // independent of supplied input parms which control samples per cycle and buffer size.
    // This avoids that "pop" which otherwise happens when rendering audio curves
    // which begins at say 0.5 of a possible range -1 to 0 to +1


    int_number_of_samples := int(number_of_samples)

    if int_number_of_samples == 0 {

        panic("ERROR - seeing 0 number_of_samples in pop_audio_buffer ... float number_of_samples " +
            FloatToString(number_of_samples) + " is your desired_num_seconds too small ? " +
            " or maybe too low value of sample rate")
    }

    source_buffer := make([]float64, int_number_of_samples)

    incr_theta := (2.0 * math.Pi * given_freq) / samples_per_second

    theta := 0.0

    for curr_sample := 0; curr_sample < int_number_of_samples; curr_sample++ {

        source_buffer[curr_sample] = math.Sin(theta)

        theta += incr_theta
    }

    return source_buffer, nil

} //      pop_audio_buffer
...