Web Audio API: как использовать FFT для преобразования из временной области и использовать iFFT для преобразования данных обратно - PullRequest
0 голосов
/ 10 февраля 2020

Я пытался преобразовать аудиоданные в данные частотной области, отредактировать эти данные и восстановить звук из этих данных.

Я следовал инструкциям:

  1. OfflineAudioContext для получения буфера для выполнения анализа,
  2. AnalyserNode для выполнения анализа и
  3. PeriodicWave, чтобы восстановить волну.

Звук, воспроизводимый OfflineAudioContext, должен соответствовать звуку PeriodicWave, но это явно не так. В инструкции сказано, что так и должно быть, поэтому я явно что-то упускаю.

(Кроме того, я не знаю, что использовать для ввода действительного и мнимого значений PeriodicWave. Из инструкций действительные значения - синусы, а мнимые - косинусы, поэтому я установил все мнимых значений до 0, так как у меня нет косинусных значений из анализа БПФ от AnalyserNode, и, похоже, другого пути нет.)

До сих пор самым простым и близким, что я получил, является следующее скрипт (https://jsfiddle.net/k81w04qv/1/):

<code><!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width">

  <title>Audio Test</title>
  <link rel="stylesheet" href="">
  <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>

<body>
  <h1>Audio Test</h1>
  <button id='0'>Play original sound</button>
  <button id='1'>Play reconstructed sound</button>
  <pre>
switch (канал) {case 0: var freq = 200 + 10 * freqSin (9, время) ;; var amp = 0,7; var output = amp * Math.sin (freq * (2 * pi) * time); перемена; случай 1: var freq = 900 + 10 * freqSin (10, время); var amp = 0,7; var output = amp * Math.sin (freq * (2 * pi) * time); перемена; } //console.log(output) return output; }

Интересная дополнительная проблема этого сценария заключается в том, что после воспроизведения исходного звука вы не можете воспроизводить восстановленный звук (хотя вы можете воспроизводить оригинальный звук как сколько бы вы хотели). Чтобы воспроизвести восстановленный звук, вы должны сначала воспроизвести его, затем он будет воспроизводиться только по refre sh. (Вы также можете воспроизвести его после воспроизведения оригинального звука, если воспроизводите его во время воспроизведения оригинального звука.)

1 Ответ

1 голос
/ 10 февраля 2020

Чтобы это работало, вам нужны как действительные, так и мнимые части БПФ сигнала во временной области. AnalyserNode только дает вам величину; вам не хватает фазового компонента.

Извините, это не сработает.

...