0

オーディオファイルから幅17のマトリックスを取得しようとしています。を使用するとエラーが発生します。*行列の次元は一致する必要があります。それはどういう意味ですか、そして私はそれをどのように修正することになっていますか?

エラーが発生していますwindowed_frame = window.*input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1);

[input fs] = wavread('3_1.wav');

fn = fs/2;
bins = 512; %useable bins
frame_length = bins;
window = hamming(frame_length);
overlap = .5;
number_of_frames = (length(input)/(frame_length)/overlap) - 1;

for k=1:number_of_frames

        windowed_frame = window.*input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1);

        fft_window = fft(windowed_frame,bins*2);
        fft_window = abs(fft_window(1:bins));
        fft_energy = fft_window.^2;
        freq_vector = [fn/bins:fn/bins:fn];

編集:フルコード関数test_energy = energy_per_frame(file)

[入力fs]=wavread( '1_2.wav');

fn = fs/2;
bins = 512; %useable bins
frame_length = bins;
window = hamming(frame_length);
overlap = .5;
number_of_frames = (length(input)/(frame_length)/overlap) - 1;

for k=1:number_of_frames

    windowed_frame = (window.*input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1)).';

        fft_window = fft(windowed_frame,bins*2);
        fft_window = abs(fft_window(1:bins));
        fft_energy = fft_window.^2;
        freq_vector = [fn/bins:fn/bins:fn];

        %map bark (z) to bins (1-512) and frequency (freq_vector)
        for i=1:length(freq_vector)
            z(i) = 13*atan(0.76*(freq_vector(i)/1000)) + 3.5*atan(((freq_vector(i)/1000)/7.5).^2);    
        end

        z = floor(z);

        for j=1:length(z);
            if z(j) == 17
                z(j)=16;
            end
        end

        temp = 0;
        temp_sum = 0;
        count = 0;

        %calculate the energy per bark band
        for i=1:length(z)
           if temp == z(i)
               temp_sum = fft_energy(i)+ temp_sum;
               test_energy(k,temp+1) = temp_sum; 
               count = count+1;
           end

           if temp ~= z(i)   
              test_energy(k,temp+1) = temp_sum/count;
              temp = temp+1;
              temp_sum = fft_energy(i);
              count = 1;
           end  
        end  

end
4

1 に答える 1

0

.*演算子は要素ごとの乗算です。あなたの場合、それはの各要素がwindow部分行列の対応する要素で乗算されることを意味しますinput。これは操作の結果です。

input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1)

明らかに、両方の行列の次元は異なります。次のように入力することで、それを確認できます。

size(window)
size(input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1))

これは行と列の問題だと思います。結果の部分行列inputは1x512のベクトルwindowsですが、は512x1のベクトルです。

解決策:.'最後に、実際にはMATLABの転置演算子であるドットアポストロフィ()を追加してみてください(データが複雑な場合は、'演算子である複素共役転置とは対照的です)。サブマトリックスinputの、そのように:

windowed_frame = window .* input(blah blah...).'  %// <-- Note the .'

私はこれがあなたの問題を修正するはずだと信じています。

より一般的な解決策は、コロン演算子()を使用して、両方のベクトルを強制的に列ベクトルにすることです。:

input_window = input(((k-1)*bins*overlap)+1:(((k-1))*bins*overlap)+1+bins-1);
windowed_frame = window(:) .* input_window(:);
于 2013-03-24T14:16:44.880 に答える