声音波峰和波谷

在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,所以也遗漏了两次鼾声,总的来说还不错.
 

### 回答1: 有人声的波形图会显示出明显的声音波形,即有间隔的波峰波谷,而只有杂音的波形图则会显示出无规律的波动,没有明显的波峰波谷。此外,有人声的波形图还可能显示出不同频率的声音波形,而只有杂音的波形图则可能只有单一的频率波动。 ### 回答2: 有人声的波形图和只有杂音的波形图在以下几个方面有明显的区别。 首先,从波形图形态上看,有人声的波形图通常展现出规律的波动,波峰波谷之间有明显间隔,呈现出一种连续性和较为平滑的形态。而只有杂音的波形图则通常表现出比较不规则、混乱的形态,波峰波谷之间的间隔不规则,没有明显的规律性。 其次,从频谱分析上看,有人声的波形图会呈现出频率集中在特定频段的特点,即出现明显的频率峰值,代表声音的基频和谐波。这意味着有人声的波形图在频谱中会有比较明显的谱线或突起。而只有杂音的波形图的频谱则通常会呈现出比较均匀、平滑的频谱分布,没有明显的峰值或集中在特定频段的特征。 第三,从声音特征上看,有人声的波形图具有一定的音乐感,可以识别出发音者的语音特征,比如音高、音色、语调等。而只有杂音的波形图通常没有明显的特定音频内容,无法从中识别出具体的声源或发音者。 综上所述,有人声的波形图和只有杂音的波形图在形态、频谱分析和声音特征等方面都存在明显差异,有人声的波形图表现出规律性、具有频率峰值和音乐感,而只有杂音的波形图则表现出不规则、频谱均匀和没有明显音频内容的特点。 ### 回答3: 有人声的波形图和只有杂音的波形图在几个方面有明显区别。 首先,有人声的波形图通常会呈现出具有一定规律和周期性的波动。因为人声是由人的声带产生的,其频率和振幅会随着讲话或唱歌的节奏而变化。在波形图中,可以看到明显的波峰波谷,形成规律的上升和下降趋势。 相比之下,只有杂音的波形图通常没有明显的规律和周期性。杂音是指不具备特定频率和振幅的声音,它们通常是由各种不同频率的声波混杂在一起形成的。因此,在杂音的波形图中,会出现非常复杂的波动曲线,没有明显的波峰波谷。 此外,有人声的波形图通常会有较高的幅度和频率范围。人的声音能够产生广泛的频率,从低音到高音都可以涵盖,因此其波形图会显示较大的振幅变化。而只有杂音的波形图的幅度和频率范围通常较窄,因为杂音不具备明确的频率和振幅。 总之,有人声的波形图和只有杂音的波形图在形状、规律性和频率范围等方面存在明显区别。有人声的波形图通常呈现出规律和周期性的波动,幅度和频率范围较大;而只有杂音的波形图通常没有明显规律,幅度和频率范围较窄。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值