Вопрос:
Я пытаюсь извлечь пики аудиофайла. У меня есть следующий код для извлечения огибающей моего амплитудного спектра. Однако я не получаю желаемый график вывода. Может кто-нибудь сказать мне, какую настройку мне нужно сделать, чтобы получить правильный график. Здесь мой код:
[song,FS] = wavread(‘c scale fast.wav’); P=20000/44100*FS; % length of filter N=length(song); % length of song t=0:1/FS:(N-1)/FS; % define time period % Plot time domain signal figure(1); subplot(3,1,1) plot(t,(3*abs(song))) title(‘Wave File’) ylabel(‘Amplitude’) xlabel(‘Length (in seconds)’) xlim([0 1.1]) xlim([0 N/FS]) % Gaussian Filter x = linspace( -1, 1, P); % create a vector of P values between -1 and 1 inclusive sigma = 0.335; % standard deviation used in Gaussian formula myFilter = -x .* exp( -(x.^2)/(2*sigma.^2));% compute first derivative, but leave constants out myFilter = myFilter / sum( abs( myFilter ) ); % normalize % Plot Gaussian Filter subplot(3,1,2) plot(myFilter) title(‘Edge Detection Filter’) % fft convolution myFilter = myFilter(:); % create a column vector song(length(song)+length(myFilter)-1) = 0; %zero pad song myFilter(length(song)) = 0; %zero pad myFilter edges =ifft(fft(song).*fft(myFilter)); tedges=edges(P/2:N+P/2-1); % shift by P/2 so peaks line up w/ edges tedges=tedges/max(abs(tedges)); % normalize % Plot song filtered with edge detector subplot(3,1,3) plot(1/FS:1/FS:N/FS,tedges) title(‘Song Filtered With Edge Detector’) xlabel(‘Time (s)’) ylabel(‘Amplitude’) ylim([-1 1.1]) xlim([0 N/FS])
Это график, который я получаю для приведенного выше кода, а im фокусируется на “песне, отфильтрованном с помощью краевого детектора”.
И это “песня, отфильтрованная с помощью краевого детектора”, которую я НЕОБХОДИЛ, чтобы получить
Лучший ответ:
Вы можете использовать преобразование Гильберта для получения конверта. Технически это возвращает аналитический сигнал . Вы получаете конверт со следующей строкой:
envelope = abs(hilbert(Song));
То, что делает преобразование Гильберта, состоит в том, чтобы взять входной сигнал fft, обнулить отрицательные частоты, а затем a ifft. Реальная часть преобразования – это исходный сигнал, мнимая часть – преобразованный сигнал. Абсолютным значением вещественной и мнимой части является огибающая, а аргумент (angle(hilbert(Song))) является мгновенной фазой.
Ответ №1
Я предполагаю, что вы хотите получить огибающую сигнала (а не его спектра, как вы говорите). Если это так, для обнаружения огибающей я использовал бы фильтр нижних частот, примененный к abs(song) (вы можете подставить abs аналогичной нелинейной функцией). Частота среза фильтра должна быть (немного) выше самой высокой частоты изменений огибающей.
Вы применяете фильтр непосредственно к форме волны, и фильтр, по-видимому, не является фильтром нижних частот. Возможно, если вы объясните свой подход, мы сможем предоставить более целенаправленную помощь.
Кстати, если ваша песня намного длиннее вашего фильтра, нулевое дополнение, за которым следует fft
, за которым следует ifft, похоже, медленный способ фильтрации. Почему бы просто не использовать conv?