Поколение формы сигнала Bandlimited [закрывается]

Я настоятельно рекомендую использовать что-то вроде react-modal ( npm ). Это позволяет вам держать модальный контент прямо рядом с триггером. Он делает это, добавляя «портал» высоко в DOM, и обрабатывает добавление контента в is.

Ваш пример может выглядеть следующим образом:

import Modal from 'react-modal';

class Homepage extends Component {

    constructor(props) {
        super(props)
        this.state = { modalOpen: false };
        this.handleOpenModal = this.handleOpenModal.bind(this)
    }

    handleOpenModal() {
        this.setState({ modalOpen: true });
    }

    render() {
        return(
            
) } } const ModalContent = () => { return(
this is the content I want to render inside the modal
) }

10
задан finalman 5 October 2009 в 11:05
поделиться

3 ответа

Существует много способов приблизиться к bandlimited поколению формы сигнала. Вы закончите тем, что торговали вычислительной стоимостью против качества, как обычно.

Я предлагаю, чтобы Вы смотрели на этот сайт здесь:

http://www.musicdsp.org/

Проверьте архив! Это полно хорошего материала. Я просто сделал поиск на ключевом слове "bandlimited". Материал, который открывается, должен Вы быть сильно занятыми, по крайней мере, в течение недели.

Btw - Не знайте, является ли это тем, что Вы поиск, но я искажал уменьшенный (например, не действительно ограниченная полоса) поколение формы сигнала несколько лет назад. Я просто вычислил интеграл между последним и демонстрационно-позиционным текущим. Для традиционных форм сигнала синтезатора можно сделать это довольно легкое при разделении интервала интеграции в особенностях (например, когда его сброс пилообразного get). Загрузка ЦП была низкой и качество, приемлемое для моих потребностей.

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

4
ответ дан 3 December 2019 в 23:15
поделиться

Это - то, что я придумал, вдохновленный идеями Nils. Вставка его здесь в случае, если это полезно для кого-то еще. Я просто фильтр поля пилообразный сигнал аналитически с помощью изменения синфазно от последнего образца как размер ядра (или сокращение). Это работает довольно хорошо, существует некоторое слышимое искажение в очень самых высоких примечаниях, но для нормального использования это звучит великолепно.

Уменьшать искажение еще больше размер ядра может быть увеличено немного, делание его 2*phaseChange, например, звучит хорошим также, хотя Вы теряете немного наибольшие частоты.

Кроме того, вот другой хороший ресурс DSP, который я нашел при просмотре SP для подобных тем: Синтез ToolKit в C++ (STK). Это - библиотека классов, которая имеет партию полезных инструментов DSP. Это даже имеет готовый использовать bandlimited генераторы формы сигнала. Метод, который они используют, должен интегрировать sinc, как я описал в своем первом сообщении (хотя я предполагаю, что они делают это лучше затем меня...).

float getSaw(float phaseChange)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange);
}

float getPulse(float phaseChange, float pulseWidth)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange) - getBoxFilteredSaw(fmod(phase + pulseWidth, 1.0f), phaseChange);
}

float getBoxFilteredSaw(float phase, float kernelSize)
{
    float a, b;

    // Check if kernel is longer that one cycle
    if (kernelSize >= 1.0f) {
        return 0.0f;
    }

    // Remap phase and kernelSize from [0.0, 1.0] to [-1.0, 1.0]
    kernelSize *= 2.0f;
    phase = phase * 2.0f - 1.0f;

    if (phase + kernelSize > 1.0f)
    {
        // Kernel wraps around edge of [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize - 2.0f;
    }
    else
    {
        // Kernel fits nicely in [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize;
    }

    // Integrate and divide with kernelSize
    return (b * b - a * a) / (2.0f * kernelSize);
}
2
ответ дан 3 December 2019 в 23:15
поделиться

Одним из быстрых способов генерации сигналов с ограниченной полосой частот является использование шагов с ограниченной полосой пропускания (BLEP). Вы генерируете сам шаг с ограничением по полосе:

enter image description here

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

enter image description here

См. Пошаговое руководство по адресу Синтез звука с ограниченным диапазоном .

Поскольку этот BLEP не является причинным (что означает, что он распространяется в будущем), для генерации сигналов в реальном времени лучше использовать шаг с ограничением полосы минимальной фазы, называемый MinBLEP , который имеет тот же частотный спектр, но простирается только в прошлое:

MinBLEP развивают идею и берут оконный sinc, выполняют реконструкцию минимальной фазы, а затем интегрируют результат и сохраните его в таблице . Теперь, чтобы создать осциллятор, вы просто вставляете MinBLEP на каждый разрыв в форме волны. Итак, для прямоугольной волны вы вставляете MinBLEP там, где форма волны инвертируется, для волны пилы вы вставляете MinBLEP, где значение инвертируется, но вы генерируете наклоняется как обычно.

7
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: