将零填充matlab数组的最简单方法是什么?
即给定[1,2,3,4]
和长度6返回[1,2,3,4,0,0]
我有一个数据数组,我希望在对数据运行fft之前应用窗口函数。
我用来将数据直接传递给fft,这会将零填充到下一个2的幂,但是现在我需要在fft之前填充零填充因此我可以乘以窗口函数。
fs = 100; % Sample frequency (Hz)
t = 0:1/fs:10-1/fs; % 10 sec sample
x = (1.3)*sin(2*pi*15*t) ... % 15 Hz component
+ (1.7)*sin(2*pi*40*(t-2)) ... % 40 Hz component
+ (2.5)*randn(size(t)); % Gaussian noise;
m = length(x); % Window length
n = pow2(nextpow2(m)); % Transform length
w = barthannwin( n ); % FFT Window
y = fft(data, n); % DFT
windowed_data = x*w ; % Dimensions do not match as x not padded
y = fft(windowed_data, n); % DFT
我知道padarray是图像处理工具箱的一部分,我没有。
答案 0 :(得分:9)
修改强>
这种方法对于矢量来说可能更好,因为它们在转置时不会中断,请注意它会改变原始矢量,这可能是不可取的:
myVec = 1:7;
myVec(end+3)=0
或者,你可以只连接零和你拥有的向量,并用它创建一个新变量。
myVec = 1:7;
requiredpadding = 10-7;
myVecPadded=[myVec zeros(1,requiredpadding)]
答案 1 :(得分:3)
没有内置函数来执行填充,但是这里有一个函数来填充向量x
,给定最小长度n
。
function y = pad(x, n)
y = x;
if length(x) < n
y(n) = 0;
end
答案 2 :(得分:1)
对于数组a
,这应该用零填充到最接近的2的幂:
a(2^ceil(log2(length(a))))=0;
答案 3 :(得分:0)
Matlab的图像处理工具箱具有内置函数来填充数组padarray(A,dim,value
对于你的例子:
A = [1, 2, 3, 4];
dimension = [0 1]; % pad with extra columns
size = 2; % how much to pad
B = padarray(A,size*dimension,'post') % 'post' says to pad at the end
% just for demonstration, let's pre-pad the first dimension (rows)
dimension = [1 0];
C = padarray(A,dimension,'pre') % just as an example
% or pad in both directions
dimension = [1 2];
D = padarray(A,dimension) % by default, it will pad both pre and post
返回
B =
1 2 3 4 0 0
C =
0 0 0 0
1 2 3 4
D =
0 0 0 0 0 0 0 0
0 0 1 2 3 4 0 0
0 0 0 0 0 0 0 0
你也可以将它用于多维数组,维度向量只需要相应地扩展,即dimension = [0 0 1]
将在第三维扩展。