Генерация синусоидальной волны от 10 до 20000 Гц с помощью SoundPool - PullRequest
3 голосов
/ 17 ноября 2010

Я попытался сгенерировать синусоидальную волну с помощью AudioTrack.Результат не был удовлетворительным.Затем я перешел в класс Soundpool.Я использовал Audacity для создания аудиофайлов за 1 секунду, а затем изменил скорость воспроизведения (.5 - 2.0), чтобы получить нужные частоты.(Массивы, поскольку существуют также пильные и треугольные волновые файлы)

    sig10000[0]=soundPool01.load(context,R.raw.sine10000,1);
    sig2500[0]=soundPool01.load(context,R.raw.sine2500,1);
    sig625[0]=soundPool01.load(context,R.raw.sine625,1);
    sig157[0]=soundPool01.load(context,R.raw.sine156,1);
    sig40[0]=soundPool01.load(context,R.raw.sine40,1);

Затем я, в зависимости от выбранной частоты, проигрываю аудио:

    public void play(){

    Signal s=null;
    float factor;
    for(int i=0;i<this.size();i++){
        s=this.get(i);
            if(s.getFreq()>4999){
                factor = s.getFreq()/10000f;
                s.setStreamID(soundPool01.play(sig10000[s.getWaveType()],.99f,.99f,0,-1,factor));                   
            }else if(s.getFreq()>1249){
                factor = s.getFreq()/2500f;
                s.setStreamID(soundPool01.play(sig2500[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else if(s.getFreq()>312){
                factor = s.getFreq()/625f;
                s.setStreamID(soundPool01.play(sig625[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else if(s.getFreq()>77){
                factor = s.getFreq()/156f;
                s.setStreamID(soundPool01.play(sig157[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else {
                factor = s.getFreq()/40f;
                s.setStreamID(soundPool01.play(sig40[s.getWaveType()],.99f,.99f,0,-1,factor));
            }

    }
}

Теперь, как я вижу,Метод отлично работает за исключением диапазона 5000-20000 Гц.Я ломаю голову над этим, не знаю, почему он не работает, и я не могу найти какие-либо шаблоны для проблемы.

Есть ли фундаментальная проблема с этим методом?

Заранее благодарю

Редактировать: "не работает объяснено" Когда я играю синусоидальные волны в диапазоне 5000-20000 Гц, очень очевидно, что частота является неточной,Это означает, что шаг далеко.Например, 19000 Гц слишком низок и легко обнаруживается на слух.Что я могу сказать, так это то, что 10000 Гц (как и 5000 Гц - моя ошибка), поэтому нормальная скорость воспроизведения является правильной. При частоте около 14 кГц высота тона сигнала больше не правильная.

Мысли / Возможные причины (?): (A) Сколько шаговтам для скорости воспроизведения (SoundPool)?В документации написано 0.5-2.0. Возможно ли, что это означает, что существует 15 различных скоростей воспроизведения? (B) Я использовал Audacity для генерации файлов .ogg.Когда я увеличиваю синус 10000 Гц, я вижу, что он не слишком плавный (частота дискретизации 44100), и волна точно не начинается и не заканчивается на 0. Может ли это наложение нежелательных сигналов?

1 Ответ

4 голосов
/ 19 ноября 2010

Мое первое предположение - физика, а не программирование.

Существует очень мало шансов, что у вашего тестового устройства будет динамик, который физически способен генерировать чистый выходной сигнал 19 кГц, поскольку это в значительной степени бессмысленно.В результате он будет выдавать другие, непреднамеренные частоты, если вы попытаетесь управлять им с частотой дискретизации 19 кГц с частотой 44 кГц.

...