2017-08-18 39 views
1

我遇到的問題是Matlab中的數組太大。陣列數據來自音頻文件。我想得到衝動迴應。數組太大而無法在matlab中劃分但不是python

我首先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 

墊。 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; 
+6

你要逐個元件('/')劃分的? (提示:是的,是的,你這樣做) –

+0

@AnderBiguri我喜歡你的笑聲。代碼已啓動並正在運行。謝謝 – iHateUni

回答

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; 
+0

謝謝。代碼功能現在。但它在數學上是正確的?如在傅里葉變換中的分割。我瀏覽了一個網站,聲明矩陣不存在劃分。它只能通過像A * A^-1這樣的矩陣求逆來工作。還是我誤會了? – iHateUni

+0

這是一個非常寬泛的數學問題,這是學習線性代數時首先要了解的一件事。請在math.stackoverflow.com上詢問數學問題,或者在此處詢問另一個具體的算法問題,謝謝 – Wolfie