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都乘以 submatrix 中的相应元素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是 1×512向量,而是windows512×1向量。

解决方案:尝试在最后添加一个点撇号 ( .'),它实际上是MATLAB 中的转置运算符'(与运算符相反,复共轭转置,如果您的数据很复杂,这可能不是您想要的)的 submatrix 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 回答