使用AnalyserNode的频率截止
Frequency Cutoff Using AnalyserNode
我正在使用Web API创建一个音频栏可视化工具,我希望栏只显示约40Hz至约10kHz。我唯一找到的是频域,但这并不能为我提供我想要的东西(AnalyserNode.fftSize)。有没有一种方法可以只可视化该频率?这是我的代码:
.controller('PlayerCtrl', function(PlayerService, $scope){
$scope.title = PlayerService.songName;
$scope.art = PlayerService.songArt;
$scope.url = PlayerService.songUrl + '?client_id=54970813fe2081a104a874f0f870bcfe';
if (! window.AudioContext) {
if (! window.webkitAudioContext) {
alert('no audiocontext found, update your browser yo');
}
window.AudioContext = window.webkitAudioContext;
}
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioCtx.createAnalyser();
analyser.minDecibels = -60;
analyser.maxDecibels = 0;
analyser.smoothingTimeConstant = 0.85;
var audioBuffer;
var sourceNode;
var javascriptNode;
var canvas = document.querySelector('.visualizer');
var canvasCtx = canvas.getContext("2d");
var intendedWidth = document.querySelector('.now-playing').clientWidth;
canvas.setAttribute('width',intendedWidth);
var visualSelect = document.getElementById("visual");
var drawVisual;
setupAudioNodes();
loadSound($scope.url); //music file
function loadSound(url) {
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function() {
audioCtx.decodeAudioData(request.response, function(buffer) {
playSound(buffer);
}, function(error){
console.log(error)
});
};
request.send();
}
function playSound(buffer) {
sourceNode.buffer = buffer;
sourceNode.start(0);
$(".content").show();
$("#hue").hide();
}
function setupAudioNodes() {
console.log('audio nodes')
javascriptNode = audioCtx.createScriptProcessor(2048, 1, 1);
javascriptNode.connect(audioCtx.destination);
sourceNode = audioCtx.createBufferSource();
sourceNode.connect(analyser);
analyser.connect(javascriptNode);
sourceNode.connect(audioCtx.destination);
visualize();
}
function visualize() {
console.log('viz');
WIDTH = canvas.width;
HEIGHT = canvas.height;
analyser.fftSize = 64;
var bufferLength = analyser.frequencyBinCount;
console.log(bufferLength);
var dataArray = new Uint8Array(bufferLength);
canvasCtx.clearRect(0, 0, WIDTH, HEIGHT);
function draw() {
drawVisual = requestAnimationFrame(draw);
analyser.getByteFrequencyData(dataArray);
canvasCtx.fillStyle = 'rgb(0, 0, 0)';
canvasCtx.fillRect(0, 0, WIDTH, HEIGHT);
var barWidth = (WIDTH / bufferLength) * 2.5;
var barHeight;
var x = 0;
for (var i = 0; i < bufferLength; i++) {
barHeight = dataArray[i];
canvasCtx.fillStyle = 'rgb(' + (barHeight + 100) + ',50,50)';
canvasCtx.fillRect(i*17, HEIGHT - barHeight / 2, 10, barHeight);
x += barWidth + 1;
}
}
draw()
}
})
只是不要使用分析仪计算的较高频率。要做到这一点,最简单的方法是将bufferLength设置为比analyzer.frequencyBinCount更小的值。分析仪将为您提供尽可能多的数据,并将其余数据丢弃。
仓的间隔均匀,从零到采样率的一半,因此在典型的采样率(44kHz)下,您需要大约一半的仓。更一般地说,Math.ceil(analyser.frequencyBinCount * 10000 / (audioCtx.sampleRate / 2))
应该给你想要的号码。
您需要计算频率分辨率:sampleRate/fftSize。这将为您提供getByteFrequencyData
给您的每个数字的频率范围。当然,如果您依赖默认的sampleRate,则很难知道该比率。按如下方式覆盖:
let audio_context = new AudioContext({
sampleRate: 44000,
});
我解释了@mehmet关于的回答
频率分辨率:sampleRate/fftSize
意思是总数在显示的eq波段之间进行划分。
calcFreqs(sampleRate, fftSize) {
const bands = fftSize/2; // bands are half the fftSize
const fqRange = sampleRate / bands;
let allocated = [];
for ( let i = 0, j = bands; i < j; i++ ) {
sampleRate = Math.round(sampleRate - fqRange);
allocated.push(sampleRate);
}
// console.log(allocated.slice().reverse());
return allocated.slice().reverse();
}
因此,对于48000Hz以上的16个波段样本:
[0, 3000, 6000, 9000, 12000, 15000, 18000, 21000, 24000, 27000, 30000, 33000, 36000, 39000, 42000, 45000]
我想请一位专家澄清一下,但下面是这样做的方法。我的项目在Github
- 使用AnalyserNode的频率截止
- Undercore:查找数组中出现频率最高的对象
- 根据已经给定的频率创建一个d3.js直方图
- 单词中重复出现字母频率最高的字符串
- requestAnimationFrame的触发频率远高于每秒60帧
- 增加Meteor.observe的更新频率
- ajax获取数据的频率不同
- 如何在JavaScript中检测声音的频率
- 初学者:掷骰子:频率和如果-否则-如果
- 当音频元素暂停时,AnalyserNode会继续发送数据
- 按频率对数组进行排序
- 正弦波.js设置新频率时不会播放多个音符
- Web Audio API's AnalyserNode alternative for Node.js
- 将频率(大致)从一个 Web 音频流“克隆”到另一个白噪声流
- 将频率均匀分布到画布音频分析仪
- 计算 JavaScript 中数组中元素的频率
- 打开和关闭 IndexedDB 数据库连接的频率
- 下划线.js:查找数组中出现频率最高的值
- 如何在代码点火器中查找数据库值的平均值和频率
- AnalyserNode是否更新其“;当前频率数据”;持续