每当vol> 6时我如何以1计数

时间:2019-05-17 23:24:37

标签: javascript audio p5.js

每次麦克风听到手指轻弹时,我都会尝试加1。

var mic;
var vol;
var count = 0;


function setup() {
  createCanvas(windowWidth, windowHeight);

  mic = new p5.AudioIn();
  mic.start();
}

function draw() {
  background('pink');

  vol = mic.getLevel(); // level is between 0 and 1
  vol = vol * 100;

  if (vol > 6) {
    count += 1;
    text(count, 60, 300);

    //if (count += 1) {
    //  vol = 0;
    //}

  } else {
    text(count, 60, 300);
  }
}  

问题: 用我当前的代码,它会在手指弹响的持续时间内继续计数。我该怎么写才能在每个手指扣一次将var计数加1

2 个答案:

答案 0 :(得分:0)

如果要计算何时音量超过6,则需要一个标志来知道何时音量已降至该阈值以下。

因此,设置一个像这样的变量:

var waitingForVolumeIncrease = true;

然后在代码中,当您增加计数时,还将标志设置为false。

添加另一个条件来检查音量是否小于6,将标志重置为true。

最后,您只想在标记设置为true时增加计数,因此您需要更新检查以确保标记设置为true。

答案 1 :(得分:0)

记录最后的快照开始时间,并检查是否在old_snap_time + snap_duration之后到达新的快照:

var mic;
var vol;
var count = 0;
var snapDurationMs = 500;
var lastSnap = 0;

function setup() {
  createCanvas(windowWidth, windowHeight);
  strokeWeight(4);
  stroke('rgba(0,255,0,0.25)');
  fill(color(0, 0, 255));
  textSize(40);

  mic = new p5.AudioIn();
  mic.start();
}

function draw() {
  background('pink');

  vol = mic.getLevel(); // level is between 0 and 1
  vol = vol * 100;

  let now = millis();

  if (vol > 25 && now - lastSnap > snapDurationMs) {
    count += 1;
    lastSnap = now;
  }

  text(count, 100, 300);
}  

顺便说一句,平局中不需要其他{}部分,因为在这种情况下,您将丢失一些帧

编辑

稍微更改了常量。在我的麦克风中,合理的声音阈值约为输入电平的25%-30%(如果较低)-我们开始检测麦克风中的随机噪声事件。拍拍持续时间也更改为500 ms,因为如果拍拍持续时间较短,我们可能会开始对同一拍拍计数两次甚至更多。

即使使用这些修复程序,有时麦克风仍会检测到“重音捕捉”,因为麦克风是具有极低信噪比的设备。因此,为了获得更高的准确性,需要使用其他方法,例如:

  1. 连续记录麦克风信号(电平)
  2. 通过傅立叶变换将其转换为频域
  3. 滤除低振幅的频率
  4. 使用IFT将滤波后的信号转换回时域
  5. 将过滤后的信号与您的预先录制的手指捕捉配置文件进行比较
  6. 如果这些信号匹配,则计数++

但是这个算法是完全不同的故事,所以不在这里