2022-07-28 来源:华纳网 责任编辑:Sunny 人气:
核心提示:大家好,欢迎来到谷雨课堂

本课内容:

大家好,欢迎来到谷雨课堂

 

上节,我们讲了如何在H5录音、保存、下载这些功能

那么本节,我们深入一下

来把获取到的实时音频数据

画出频谱图来

 

在我们调用的程序,其实只需几句话

  •  
  •  
  •  
  •  
document.querySelector(".recpowerx").style.width=powerLevel+"%";document.querySelector(".recpowert").innerText=bufferDuration+" / "+powerLevel;//可视化图形绘制wave.input(buffers[buffers.length-1],powerLevel,bufferSampleRate);

不过实现这个的原理,

还是非常复杂的,

甚至还涉及到高数中的微积分,

有在读高中或大学的同学们,

一定要学好数学了,

 

其中声音二进制数据转频谱的代码如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Recorder.LibFFT=function(bufferSize){  "use strict";
var FFT_N_LOG,FFT_N,MINY;var real, imag, sintable, costable;var bitReverse;
var FFT_Fn=function(bufferSize) {//bufferSize只能取值2的n次方    FFT_N_LOG=Math.round(Math.log(bufferSize)/Math.log(2));    FFT_N = 1 << FFT_N_LOG;    MINY = ((FFT_N << 2) * Math.sqrt(2));
    real = [];    imag = [];    sintable = [0];    costable = [0];    bitReverse = [];
var i, j, k, reve;for (i = 0; i < FFT_N; i++) {      k = i;for (j = 0, reve = 0; j != FFT_N_LOG; j++) {        reve <<= 1;        reve |= (k & 1);        k >>>= 1;      }      bitReverse[i] = reve;    }
var theta, dt = 2 * Math.PI / FFT_N;for (i = (FFT_N >> 1) - 1; i > 0; i--) {      theta = i * dt;      costable[i] = Math.cos(theta);      sintable[i] = Math.sin(theta);    }  }
/*  用于频谱显示的快速傅里叶变换     inBuffer 输入FFT_N个实数,返回 FFT_N/2个输出值(复数模的平方)。  */var getModulus=function(inBuffer) {var i, j, k, ir, j0 = 1, idx = FFT_N_LOG - 1;var cosv, sinv, tmpr, tmpi;for (i = 0; i != FFT_N; i++) {      real[i] = inBuffer[bitReverse[i]];      imag[i] = 0;    }
for (i = FFT_N_LOG; i != 0; i--) {for (j = 0; j != j0; j++) {        cosv = costable[j << idx];        sinv = sintable[j << idx];for (k = j; k < FFT_N; k += j0 << 1) {          ir = k + j0;          tmpr = cosv * real[ir] - sinv * imag[ir];          tmpi = cosv * imag[ir] + sinv * real[ir];          real[ir] = real[k] - tmpr;          imag[ir] = imag[k] - tmpi;          real[k] += tmpr;          imag[k] += tmpi;        }      }      j0 <<= 1;      idx--;    }
    j = FFT_N >> 1;    var outBuffer=new Float64Array(j);    sinv = MINY;    cosv = -MINY;for (i = j; i != 0; i--) {      tmpr = real[i];      tmpi = imag[i];if (tmpr > cosv && tmpr < sinv && tmpi > cosv && tmpi < sinv)        outBuffer[i - 1] = 0;else        outBuffer[i - 1] = Math.round(tmpr * tmpr + tmpi * tmpi);    }return outBuffer;  }
  FFT_Fn(bufferSize);return {transform:getModulus,bufferSize:FFT_N};};

 

 

完整的源代码可以登录【华纳网】下载。

https://www.worldwarner.com/

 






免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。