Matlab:正确地将矩阵切成两半以进行信号处理

时间:2018-01-09 02:38:27

标签: matlab matrix signal-processing

我正在研究一个信号处理Matlab项目。我正在执行FFT并将矩阵切成两半以仅获得单面光谱。我使用以下代码行并获得错误“警告:当用作索引时,冒号操作符需要整数操作数 “:

amp = abs(y).^2/n;    % amplitude of the DFT
amp = amp(1:end/2);

为了摆脱警告,我试图手动围绕它,但当我这样做时,我得到错误“错误使用圆形 没有足够的输入参数。“

amp = abs(y).^2/n;    % amplitude of the DFT
amp = amp(1:round(end/2));

我想知道的是,将单面光谱的矩阵切成两半的正确方法是什么?作为旁注,这是整段代码:

clear all;

% Read Audio
fs = 44100;         % sample frequency (Hz)
full = audioread('song.wav');

% Remove leading 0's and select range
for i = 1:fs
    if full(i) ~= 0
        crop = i;
        break
    end
end
full = full(crop:end);

startTime = 1;
endTime = 5;

% Play song
tic
initialTime = toc;
player = audioplayer(full(fs*startTime:fs*endTime), fs);
player.play();

% Perform fft and get frequencies (hopefully in realish time with audio)
windowSize = fs/16;
for i = windowSize/2+1+fs*(startTime-1) : fs/32 : fs*endTime
    beginningChunk = round(i-windowSize/2);
    endChunk = round(i+windowSize/2);

    x = full(beginningChunk:endChunk);
    y = fft(x);
    n = length(x);     % number of samples in chunk
    amp = abs(y).^2/n;    % amplitude of the DFT
    amp = amp(1:round(end/2));
    f = (0:n-1)*(fs/n);     % frequency range
    f = f(1:round(end/2));
    while initialTime+i/fs > toc
        pause(.0001);
    end
    figure(1);
    plot(f,amp);
    axis([0 10000 0 5]);
    xlabel('Frequency');
    ylabel('amplitude');
end

1 个答案:

答案 0 :(得分:2)

如果amp(1:round(end/2))对您不起作用(它似乎适用于R2017a),请尝试使用amp(1:round(length(amp)/2))。 (或者更好的是,使用floor。)

请注意,end在这种情况下严格为numel(amp),因为您使用线性索引(使用一个值建立索引)。由于amp是向量,length是相同的。

在一般情况下,A(end,end),第一端相当于size(A,1),第二端相当于size(A,2)

您可能遇到错误的第二个原因是您有一个名为round的自定义函数。在MATLAB命令提示符下键入which round,以查找键入round(1)时调用的内容。