如何归一化频率数组
How to normalize an array of frequencies
我有两个音频文件源自一个文件,我将其分为一个 "signal" 文件和一个 "noise" 文件 - background.I 需要知道主频率、分布模式或该录音的频率,以便能够比较不同动物发出的不同声音。
我对每个文件都进行了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
我认为没有最好的方法来归一化频谱数据(取决于您要回答的问题),但考虑到您不关心绝对幅度,而是关心主频率的分布,我会依靠密度并通过频谱总和进行归一化:
norm_bin = bindel / sum(bindel)
我假设您比较的所有录音的 NFFT 都是相同的,如果不是这种情况,请将 NFFT 考虑在内:
norm_bin = bindel / mean(bindel)
我有两个音频文件源自一个文件,我将其分为一个 "signal" 文件和一个 "noise" 文件 - background.I 需要知道主频率、分布模式或该录音的频率,以便能够比较不同动物发出的不同声音。
我对每个文件都进行了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
我认为没有最好的方法来归一化频谱数据(取决于您要回答的问题),但考虑到您不关心绝对幅度,而是关心主频率的分布,我会依靠密度并通过频谱总和进行归一化:
norm_bin = bindel / sum(bindel)
我假设您比较的所有录音的 NFFT 都是相同的,如果不是这种情况,请将 NFFT 考虑在内:
norm_bin = bindel / mean(bindel)