📄 f_blockconv.asv
字号:
function [y,L,M,Q,N] = f_blockconv (h,x)
% F_BLOCKCONV: Perform fast block convolution of two signals
%
% Usage: [y,L,M,Q,N] = f_blockconv (h,x)
%
% Entry: h = vector of length L containing first signal
% x = vector of length M > L containing second signal
%
% Exit: y = vector of length L+M-1 containing the convolution
% of h with x
% L = length of h
% M = length of zero-padded x
% W = number of blocks
% N = length of block
%
% See also: f_conv, f_corr
% Initialize
L = length(h);
M = length(x);
if M < L
y = f_blockconv (x,h);
return
elseif M == L
y = f_conv(h,x,0);
return
end
% Pad x with zeros, as needed, to make M = QL for some integer Q
M_save = M;
if mod(M,L) > 0
r = L - mod(M,L);
M = M + r;
x = [f_torow(x) zeros(1,r)];
end
Q = M/L;
y = zeros(1,L+M_save-1);
% Compute h_z and H_z
N = 2^(ceil(log(2*L)/log(2)));
h_z = [f_torow(h) zeros(1,N-L)];
H_z = fft(h_z);
% Compute y
y0 = zeros(1,L*(Q-1)+N);
y1 = zeros(1,N);
for i = 0 : Q-1
m = i*L;
x_i = x(m+1:m+L);
x_iz = [f_torow(x_i) zeros(1,N-L)];
X_iz = fft(x_iz);
y1 = ifft(H_z .* X_iz);
y0(m+1:m+N) = y0(m+1:m+N) + y1;
end
y = y0(1:L+M_save-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -