5

オーディオ ファイルのピークを抽出しようとしています。振幅スペクトルのエンベロープを抽出する次のコードがあります。ただし、目的の出力グラフが得られません。適切なグラフを取得するために必要な調整を教えてください。これが私のコードです:

[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])

これは、上記のコードに対して取得したグラフであり、私はに焦点を当てています

これは、上記のコードで取得したグラフであり、「エッジ検出器でフィルタリングされた曲」プロットに焦点を当てています

ここに画像の説明を入力

そして、これは私が取得する必要がある「エッジ検出器でフィルタリングされた曲」のプロットです

4

2 に答える 2

1

信号のエンベロープを取得したいと思います(あなたが言うように、そのスペクトルではありません)。その場合、エンベロープ検出のために、適用されるローパス フィルターを使用します (同様の非線形関数でabs(song)置き換えることができます)。absフィルターのカットオフ周波数は、エンベロープ バリエーションの最高周波数より (わずかに) 高くする必要があります。

フィルタを波形に直接適用していますが、フィルタはローパス フィルタではないようです。おそらく、あなたのアプローチを説明していただければ、より焦点を絞ったヘルプを提供できます。

ところで、あなたの歌があなたのフィルターよりずっと長い場合、ゼロパディングに続いてfft続くフィルター処理ifftは遅い方法のようです. なぜ使用しないのconvですか?

于 2013-07-22T20:56:00.563 に答える