Java Sine Oscillator для эффекта Flanger

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

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

public void oscillateNumber(){
    for (int i = 0; i < 200; i++){
            oscResult = Math.sin((Number1* Math.PI)/180.0);
        updateNumber();
    }
}

И имея Number1, варьирующийся от -180 до 180 (нашел это решение здесь: Как использовать волну синуса/косинуса для получения колеблющегося числа)

Как я мог включить частоту в этот осциллятор? Частота должна регулироваться в диапазоне от 0 до 5 Гц...

Я совершенно новичок в этом материале, поэтому я не совсем понимаю его механику, еще одна функция, которую я обнаружил, это

public void oscillateNumber3(){
    for (int i = 0; i < 400; i++){
        oscResult = (float)Math.sin( angle ); 
        angle += (float)(2*Math.PI) * frequency / 44100f;
        java.lang.System.out.println(oscResult);
    }
}

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

Любой указатель на это будет действительно оценен.

ОБНОВИТЬ

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

public void oscillatorNumber(int frequency, int sampleRate){
    for (int t = 0; t < (sampleRate * frequency); t++){
        oscResult = (float)Math.sin( angle ); 
        angle += (float)(2*Math.PI) * 2 * (t / 44100); // sin(2*pi* f  *(t/Fs))
        java.lang.System.out.println(oscResult);
    }
}

Это выглядит правильно?


person Alex    schedule 26.02.2012    source источник


Ответы (1)


Общее выражение для синусоидального осциллятора:

y(t) = sin(2*pi*f*t)

где f — частота в Гц, а t — время в секундах.

person Oliver Charlesworth    schedule 26.02.2012
comment
Спасибо за это, Оли, не могли бы вы взглянуть на функцию, которую я разместил в обновлении? Мне нужно что-то, что будет постоянно давать значение осциллятора, когда я применяю другой эффект, но я думаю, что это не совсем так... Не могли бы вы просто проверять прошедшее время при каждом обновлении, чтобы получить t? - person Alex; 27.02.2012