Неточное определение частоты звука браузера - PullRequest
0 голосов
/ 26 октября 2018
import PitchFinder from 'pitchfinder'

const detectPitch = PitchFinder.AMDF()
const notes = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'G', 'G#']

export default {
  data () {
    return {
      note: 'A',
      register: 4,
      cents: 0
    }
  },
  mounted () {
    navigator.mediaDevices.getUserMedia({ audio: true })
      .then(stream => {
        const context = new AudioContext()
        const source = context.createMediaStreamSource(stream)
        const processor = context.createScriptProcessor()

        source.connect(processor)
        processor.connect(context.destination)

        processor.onaudioprocess = e => {
          const hz = detectPitch(e.inputBuffer.getChannelData(0))
          if (hz) {
            console.log(hz)

            // ¢ or c = 1200 × log2 (f2 / f1), 1 semitone = 100 cents
            const semitones = 12 * (Math.log2((hz) / 440))
            const cents = semitones * 100

            // TODO: update component
          }
        }
      })
      .catch(e => {
        // TODO: handle error
      })
    }
  }
}

У меня есть вышеуказанный код в моем компоненте Vue (обратите внимание, что для контекста присоединен только некоторый код, связанный с Vue). У меня проблема, когда значение, выводимое на консоль, является неточным.Я использовал дрон и проверил его высоту с помощью других уважаемых тюнеров (A = 440 Гц).При выводе на консоль с моим кодом, Гц всегда ~ 404, другие высоты также смещены.Это почему?Благодаря.

1 Ответ

0 голосов
/ 26 октября 2018

Неверная частота дискретизации где-то в вашем коде.

440 * 44100.0/48000.0 = 404.25

Я предполагаю, что ваш аудиовход работает на частоте 48 кГц, но детектор высоты тона считает, что частота дискретизации составляет 44,1 кГц.

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