如何归一化频率数组

时间:2018-09-26 09:31:34

标签: matlab signal-processing normalization

我有两个来自一个文件的音频文件,我将其分为“信号”文件和“噪声”文件(背景)。我需要知道该录音的主要频率,分布模式或频率,以便能够比较不同动物发出的不同声音。

我对每个文件执行了fft,然后从信号中扣除了背景噪声。

我不在乎20kHz以下和100kHz以上对我会发生什么,它们是要被丢弃的噪声。

振幅是我无法控制的,因此每次录制都必须标准化。

标准化这些数据并使不同记录之间的比较在统计上可行的最佳方法是什么?

function bindel=binset(raw_data_val,signal,noise)

    %in case all the recording is only noise
    if isempty(signal)
        bindel=nan;
        return
    end

    %frequancy of sampling
    %Fs= 250000;

    %extract the signal parts and noise parts
    %"signal" is an index array of all the elemnts of the 
    %"raw data" array that contain a signal
    signal_data=raw_data_val(signal);
    noise_data=raw_data_val(noise);

    %determine the size of the signal array
    L= size(signal_data,1);

    NFFT = 2^nextpow2(L(1,1));


    Y1 = fft(signal_data,NFFT)/L(1,1);

    del1=smooth(2*abs(Y1(1:NFFT/2+1)));

    Y2 = fft(noise_data,NFFT)/L(1,1);

    del2=smooth(2*abs(Y2(1:NFFT/2+1)));

    del=del1-del2;

    %combine the data into 125 bindels
    binsum=size(del)/125;
    bindel=zeros(1,125);
    for j=1:125,
        bindel(j)= sum(del((j-1)*floor(binsum(1,1))+1:j*floor(binsum(1,1))));
    end

    %%%deleting low freuqencies- testing filter set to change
    %%%everything bellow 20 khz to zero
    %%%normalizing between 1 to 0
    bindel(1:20)=0;
    bindel(100:end)=0;
    norm_bin=(bindel - min(bindel)) / ( max(bindel) - min(bindel) );


    bindel=norm_bin;

end

1 个答案:

答案 0 :(得分:0)

我认为没有一种标准化频谱数据的最佳方法(取决于您要回答的问题),但是鉴于您不在乎绝对振幅而是主频率的分布,我会依靠密度并通过频谱总和归一化:

norm_bin = bindel / sum(bindel)

我假设您比较的所有记录的NFFT都相同,如果不是这种情况,请考虑NFFT归一化:

norm_bin = bindel / mean(bindel)