Как изменить этот код преобразования частоты дискретизации, чтобы звук замедлялся? - PullRequest
1 голос
/ 23 мая 2019

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

Я пытался изменить некоторые переменные типа int, но безуспешно

public void helium(String sourceFile, String targetFile)
    {
        Sound sourceObj = new Sound(sourceFile);                                //Construct a new Sound object called sourceObj. A sourceObject now represents the sourceFile object.
        Sound target = new Sound(targetFile);                                   //Construct a new Sound object called target. The target object now represents the targetFile object.
        int sampleValue = 0;                                                    //The sampleValue variable is declare as an int and is initialized to 0.
        int targetIndex = 0;                                                    //The targetIndex variable is declared as an int and is initialized to 0.

        for(int index = 0; index < sourceObj.getLength(); index+=2)             //A for loop is created to traverse the length of the sourceObj. Notice that the loop increments by two each time, not 1.
        {
            sampleValue = sourceObj.getSampleValueAt(index);                    //The getSampleValueAt() method gets the sample value at index position of sampleObj.
            target.setSampleValueAt(targetIndex,sampleValue);                   //The setSampleValueAt() method sets the sample value at the targetIndex position in the target file.
            targetIndex++;                                                      //The targetIndex variable is incremented by 1 each time through the loop.
        }
        target.play();                                                          //The play() method is invoked on the target object to play the audio with the high pitched audio.
        target.write("heliumn.wav");                                            //The write() method is invoked on the target object and the audio with the new higher pitch is saved as a .wav file.
    }  

Результат должен сделать .wav более медленным и глубоким звучанием

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Думайте об этом с чисто акустической точки зрения. Это просто, и я уверен, что вы уже понимаете, как это работает. Вот синусоида 100 Гц.

100Hz sine wave

Вы можете изменить высоту звуковой волны, просто повышая или понижая ее частоту, верно? Поэтому, если мы «сжимаем» эту синусоидальную волну с коэффициентом 2, мы получаем синусоидальную волну 200 Гц, которая звучит более высоко.

200Hz sine wave

То, что делает пример кода, становится немного понятнее с учетом этого. Для каждых 2 звуковых сэмплов в оригинальном звуке мы записываем этот сэмпл в новый целевой звук. Таким образом, мы полностью отбрасываем каждый второй образец. Это делает последовательность на 1/2 длины, увеличивая тем самым ее частоту и повышая высоту тона.

Чтобы удлинить / уменьшить / уменьшить частоту звука, вам нужно сделать обратное, т. Е. Вам нужно продублировать данные в каждой точке выборки. Пройдите каждую выборку, а не каждые две, и запишите эту выборку дважды.

Этот процесс называется преобразование частоты дискретизации , и его тезка довольно ясна. Преобразование частоты дискретизации - это самая простая форма растяжения звука, которую вы можете выполнить.

0 голосов
/ 23 мая 2019

enter image description here
Вот наглядное представление о том, что вы хотите сделать по сравнению с тем, что он делал изначально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...