У меня есть два аудиофайла, созданные из одного файла, который я разделил на файл «сигнал» и файл «шум» - фон. Мне нужно знать доминирующие частоты, шаблон распределения или частоты этой записи, чтобы иметь возможность сравнивать разные звуки, издаваемые разными животными.
Я выполнил fft для каждого файла, а затем вычел из сигнала фоновые шумы.
Меня не волнует, что со мной происходит ниже 20 кГц и выше 100 кГц, это шум, который нужно отбросить.
Амплитуда - это то, что я не могу контролировать, поэтому каждая запись должна быть нормализована.
как лучше всего нормализовать эти данные и сделать сравнение между разными записями статистически жизнеспособным?
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)
Если вы, например, использовали Welch FFT, у вас могло бы быть все спектры с одинаковым разрешением, даже если бы записи были разной длины. Вам просто нужно настроить окно сварочного шва так, чтобы оно подходило хотя бы один раз к любой из ваших записей.
должен ли супруг NFFT быть одинаковым на всех записях? они не. каждый аудиоклип имеет разную длину. Эту часть я не совсем понял, я наполовину наполовину подготовил этот сценарий и продолжил работу над ним. Я попробую то, что вы предложили, и, если никто не сможет добавить к этому, закрою тему. Спасибо