折腾来折腾去

pikipity的blog

银行机按键声音

这件事的起因是和女朋友争辩银行机的按键声音是否一样,我认为,既然电话的声音都是由两个频率决定,每个按键声音不一样来提示用户按对按键,那么银行机也应该是这样了,而女朋友认为银行机按键为了保密所有按键应该是一样的,争辩不出结果于是决定做实验,于是跑到东亚9楼的ATM取款机用手机录制了下面的4段音频(没找到提供音乐外链的网网站,只能压缩之后用“百度盘”了):

录制的音频文件和处理得到的音频时域和频域图像

好,现在开始处理。我认为只要能用 Matlab 对按键声音做 FFT,看按键声音频率是否一样就可以了。拿其中的一段音频做例子,我是这样处理的。

  1. 原始音频文件竟然是flac格式的,无法导入 MATLAB,于是先将其用音频转换软件转换为了wma格式。(我用的是 XLD 这个软件)
  2. 将音频导入 MATLAB,画出原始音频图像:

    原始音频

  3. 发现噪音还是比较明显的,于是用小波分析的函数wden去了一下噪,命令如下:

    xd=wden(x,'sqtwolog','s','mln',8,'db5');
    

    然后得到了下面的图像,并选取了两个时间点,准备截取一段按键声音做 FFT。

    去噪之后的图像

  4. 根据上面选取的时间点截取了一段按键声音后,对其做了一下 FFT(用我自己写的函数,比较方便,直接画出图像)。

    fft_plot(xd,fs,'plot');
    

    函数贴在这里:

    function [ frequency,fft_result ] = fft_plot( data,Fs,varargin )
     % Calculate or plot directly fft results of data.
     %
     % [ frequency,fft_result ] = fft_plot( data,Fs,'plot' )
     %
     % inputs:
     %   (1) data: data used to analysis
     %   (2) Fs: sample frequency
     %   (3) 'plot': veriable input. if there is not this input, fft results will be
     %   ploted
     % output:
     %   (1) freqeuncy: frequency corresponding to the fft results
     %   (2) fft_result: fft results
    
     if nargin<2
         error('data and Fs must be given');
     elseif nargin==2
         size_data=size(data);
         if size_data(1)~=1 && size_data(2)~=1
             error('the length or the number of rows must be one.');
         end
         L=length(data);
         NFFT=2^nextpow2(L);
         fft_result=fft(data,NFFT);
         frequency=Fs/2*linspace(0,1,NFFT/2+1);
     elseif nargin==3
             if strcmp(varargin,'plot')
                  size_data=size(data);
                 if size_data(1)~=1 && size_data(2)~=1
                     error('the length or the number of rows must be one.');
                 end
                 L=length(data);
                 NFFT=2^nextpow2(L);
                 fft_result=fft(data,NFFT);
                 frequency=Fs/2*linspace(0,1,NFFT/2+1);
                 figure;
                 plot(frequency,abs(fft_result(1:NFFT/2+1)));
                 title('FFT')
                 xlabel('Frequency')
                 ylabel('FFT results')
             else
                 error('variable input must be ''plot''');
             end
     elseif nargin>=3
         error('Too much inputs')
     end
     end
    

    调整了一下,频率范围,得到了这样的频域图:

    频域图

    很明显,大约在 511.4Hz,只有一个频率。看来是我错了,但是还有三段音频那,一起处理了吧。

    竟然一模一样!!

    那个小的是什么?看大小可以忽略了。。

    好像还有一段音频忘处理了,算了吧,结论很明显了。

经过上面的测试,很明显是我错了,ATM机按键声音都是一样的。之后又去 Google 上搜索了一下,看到了这些,囧。

Google 上搜索相关信息。。。第一条是怎么回事?淘宝?



Comments