声音波峰和波谷

在HR做的第四个外包项目-----智能止鼾枕头。
主要说明:由气垫组层的枕头直连设备,设备通过蓝牙协议连接手机APP,手机APP通过http请求连接服务器。
        在用户睡觉时,设备通过录音,将数据传递给手机,手机再传递给服务器,服务器进    行解析是否是鼾声,然后将回调给手机,手机再发送指令给设备,设备来控制气垫高度达到止鼾的目的。
难点说明:如何判断是鼾声。以及拿到鼾声的分贝和频率。这个是在APP历史记录里由体现的。
解答:
        如何判断是鼾声,这个问题在大学博士论文里也属于较为复杂的研究,本项目取巧,并没有进行判断是否是鼾声,而是直接对声音进行里解析

public class SoundDemo {
    public static String getNowTime() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
    /**
     * 目前该demo,仅仅限于每桢数据为16位的wav格式的声音文件
     * @param args
     * @throws UnsupportedAudioFileException
     * @throws IOException
     */

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
        //获得声音的输入流
        AudioInputStream ais = AudioSystem.getAudioInputStream(new File("E:\\1435.wav"));
        //打印声音文件的声道数,每桢的位数,以及音频频率
        printFormat(ais.getFormat());
        
        
        byte[] buf = new byte[2];
        int len;
        int length=0;
        int s=0;
        while ((len = ais.read(buf)) != -1) {
            //由于是16位的文件,正好2个byte[],而音频每秒的数据是44100个16位,
            //也就是44100*2个byte[],所以当读完44100个的
            //时候,正好意味着音频过里一秒,下面这块是打印出每秒的时间.
            length++;
            if(length%44100==0){
                s++;
                System.out.println(s+"秒");
            }
            //这块非常重要,但是位不明白这是怎么回事.
            /*
             * 首先buf[1]<8是指本文件由于是以little-endian 顺序存储数据,所以高位在后,低位在前,
             * 就如同 54这个数字,存的时候是 45 ,我们计算时就是4+5*10^1,也可以让5左移动.
             * 但为什么又"或"上低位,这个位就不知道了
             */
            short a = (short) (((buf[1] << 8) | buf[0]) / 10);
            /*
             * 由于数值非常多,而且中间由很多垃圾数据和谐波,所以,就直接取接近波峰和波谷的值
             */
            if (a > 1300) {
                System.out.println(a);
            }
            if (a < -1300) {
                System.out.println(a);
            }

        }
    }

    public static void printFormat(AudioFormat format) {
        System.out.println(format.getEncoding() + " => " + format.getSampleRate() + " hz, "
                + format.getSampleSizeInBits() + " bit, " + format.getChannels() + " channel, " +                     format.getFrameRate()
                + " frames/second, " + format.getFrameSize() + " bytes/frame");
    }
}
Console如下:
PCM_SIGNED => 44100.0 hz, 16 bit, 1 channel, 44100.0 frames/second, 2 bytes/frame
1秒
2秒
3秒
1308
1336
1316
-1455
-1733
-1837
-1679
-1712
-1531
-1549
-1682
-1711
-1711
-1663
-1553
-1404
1361
1436
1390
1332
1315
1385
1470
1467
4秒
5秒
6秒
1305
1310
-1399
-1526
1463
1545
1671
1854
1824
1793
1740
1753
1744
1487
1311
1439
1547
1639
1825
1799
1650
1598
1563
1493
1408
1343
-1327
7秒
8秒
9秒
1308
1316
1306
1308
10秒
11秒
12秒
13秒
14秒
15秒
-1379
-1790
-1654
-1524
-1356
-1686
-1866
-2010
-2268
-1809
-1432
1409
1799
1795
1826
1902
2008
2008
1869
1766
1721
1614
1442
1436
1520
1536
...
...
结论:
由于音频中有两次异常打鼾,排除这些,大概可以看出该鼾声音频的频率大约是3秒多,由于所定的阀值是1300,所以也遗漏了两次鼾声,总的来说还不错.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值