【问题标题】:Array too big for division in matlab but not python数组太大,无法在matlab中进行除法,但不是python
【发布时间】:2017-08-18 10:25:37
【问题描述】:

我遇到的问题是 Matlab 中的数组太大。数组数据来自音频文件。我想得到脉冲响应。

我首先对原始和录制的音频进行 FFT。然后按原件划分记录。最后逆 FFT 得到脉冲响应。那是我计划做的,但我被困在了部门部分。

卡住使用 Matlab,我找到了一个 python code 可以做到这一点。我把代码改写成matlab,问题又回来了。代码不完整,但足以说明问题。

希望得到很多建议和批评。谢谢

计划做但失败了,所以继续下一个代码

[y_sweep,Fs] = audioread('sweep.wav');
[y_rec,Fs] = audioread('edit_rec_sweep_laptop_1.2.wav');
fft_y1 = abs(fft(y_rec(:,1)));
fft_y2 = abs(fft(y_rec(:,2)));
fft_x = abs(fft(y_sweep));
fft_h1 = fft_y1/fft_x;
% fft_h2 = fft_y2/fft_x;
% fft_h = [fft_h1,fft_h2];
% h1 = ifft(fft1_h);

'翻译'来自 python 的代码,但仍然失败,因此来到这里

[a,fs] = audioread('sweep.wav'); % sweep
[b,fs] = audioread('rec.wav'); % rec

a = pad(a,fs*50,fs*10);
b = pad(b,fs*50,fs*10);
[m,n] = size(b);
h = zeros(m,n); 

for chan = 1:2
    b1 = b(:,1);
    ffta = abs(fft(a));
    fftb = abs(fft(b1));
    ffth = fftb / ffta;
end

pad.m 函数(从 python 翻译但应该是正确的)

function y = pad(data, t_full, t_pre)
[row_dim,col_dim] = size(data);
t_post = t_full - row_dim - t_pre;
if t_post > 0
    if col_dim == 1
        y = [zeros(t_pre,1);data;zeros(t_post,1)];
%         width = [t_pre,t_post];
    else
        y1 = [zeros(t_pre,1);data(:,1);zeros(t_post,1)];
        y2 = [zeros(t_pre,1);data(:,2);zeros(t_post,1)];
        y = [y1,y2];
%         width = [[t_pre,t_post],[0,0]];
    end 
else
    if col_dim == 1
        y = [zeros(t_pre,1);data(t_full - t_pre:end,1)];
%         width = [t_pre,0];
    else
        y = [zeros(t_pre,1);data(t_full - t_pre:end,1)];
%         width = [[t_pre,0],[0,0]];
    end
end

end

错误

Error using  \ 
Requested 4800000x4800000 (171661.4GB) array exceeds
maximum array size preference. Creation of arrays
greater than this limit may take a long time and
cause MATLAB to become unresponsive. See array size
limit or preference panel for more information.

Error in impulseresponse (line 13)
    ffth = fftb / ffta;

【问题讨论】:

  • 您想要按元素 (./) 划分吗? (提示:是的,是的)
  • @AnderBiguri 我喜欢你的暗示,哈哈。代码已启动并正在运行。谢谢

标签: python arrays matlab matrix fft


【解决方案1】:

正斜杠在 MATLAB 中是 mrdivide() 的简写。 这用于求解线性矩阵方程组。我想你想要的是rdivide,用./表示。

  • c = a/b 仅当 b 是标量时才等效于标准除法。

  • c = a./b 是逐元素除法,a 的每个元素都除以 b 的对应元素。

    [1 2 3] ./ [2 4 9]
    >> ans = [0.5, 0.5, 0.3333]
    

所以你的“计划做”代码的最后一个活动行变成了

fft_h1 = fft_y1 ./ fft_x;

【讨论】:

  • 谢谢。代码现在起作用了。但它在数学上是否正确?如傅里叶变换的除法。我浏览了一个网站,说矩阵没有划分。它只能通过像 A*A^-1 这样的矩阵求逆来工作。还是我弄错了?
  • 这是一个非常广泛的数学问题,这是学习线性代数时首先要理解的问题之一。请在 math.stackoverflow.com 上询问数学问题或在此处询问另一个特定的算法问题,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多