2016-02-28 3 views
0

MATLAB код:Невозможно преобразовать MATLAB в коде Python для repmat и симметрии

n = 2048; 
d = 1; 
order = 2048; 
nn = [-(n/2):(n/2-1)]'; 
h = zeros(size(nn),'single'); 
h(n/2+1) = 1/4; 
odd = mod(nn,2) == 1; 
h(odd) = -1 ./ (pi * nn(odd)).^2; 
f_kernel = abs(fft(h))*2; 
filt = f_kernel(1:order/2+1)'; 
w = 2*pi*(0:size(filt,2)-1)/order; 
filt(w>pi*d) = 0;      
filt = [filt , filt(end-1:-1:2)]; 
filt = repmat(filt',[1 1024]); 

Python код:

import numpy as np 
import numpy.matlib 
from numpy.matlib import repmat 
d = 1 
filt_length = 2048 
nn = np.linspace(-1024,1023,2048) 
nn = np.transpose(nn) 
h = np.zeros((2048)) 
h[1024] = 0.25 
odd = (nn%2) 
for i in range(0,2048) : 
    if odd[i] == 1 : 
    h[i] = -1/((np.pi*nn[i])**2)  

f_kernel = abs(fft(h))*2 
filt = np.transpose(f_kernel[0:1024]) 
w = (np.pi)*np.linspace(0,1,1025) 

Однако я не смог преобразовать последние 3 строки кода MATLAB для Python. Какие-либо предложения? Второй последний шаг кода MATLAB создает рамп-фильтр размером 2048 (идет от 0 до 1 с шагом 1024 и от 1 до 0 в других 1024 шагах). Последний repmat делает размер фильтра равным (2048, 1024).

ответ

0

Если бы я был на своем компьютере, я бы начал сеансы Octave и IPython и начал реплицировать код по строкам. Я бы использовал меньшие размеры, чтобы легко следить за результатами. Я бы обратил особое внимание на фигуры. Поскольку мой Matlab ржавый, это легче сделать так, как в моей голове. И более надежный.

np.arange более прост в использовании, чем linspace. transpose не требуется с 1d массивами. np.repeat или np.tile, вероятно, выполнит работу repmat's. Я точно не помню, что делает repmat. Первоначально я бы копировал циклы, но я бы попытался заменить их, когда код работает. fft может потребоваться scipy.

Смежные вопросы