Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在倍频程和matlab中用插值和repmat变换信号频率_Arrays_Matlab_Signal Processing_Octave - Fatal编程技术网

Arrays 在倍频程和matlab中用插值和repmat变换信号频率

Arrays 在倍频程和matlab中用插值和repmat变换信号频率,arrays,matlab,signal-processing,octave,Arrays,Matlab,Signal Processing,Octave,我使用的是Octave 3.8.1,类似于matlab,我尝试使用插值和repmat来改变信号的频率(因为这样做非常快(.01秒),我一次必须创建28000多个)我可以将变量num_per__sec更改为任何整数,但如果我尝试将其更改为2.1或任何包含小数点的值,我会得到一个错误“错误:重塑:无法将44100x2数组重塑为92610x1数组错误:从:第10行(repmat行)调用”是否有人可以解决此问题或其他建议 注意:请注意,ya是一个简单的测试方程我没有方程来处理信号,因此仅仅更改频率变量是

我使用的是Octave 3.8.1,类似于matlab,我尝试使用插值和repmat来改变信号的频率(因为这样做非常快(.01秒),我一次必须创建28000多个)我可以将变量num_per__sec更改为任何整数,但如果我尝试将其更改为2.1或任何包含小数点的值,我会得到一个错误“错误:重塑:无法将44100x2数组重塑为92610x1数组错误:从:第10行(repmat行)调用”是否有人可以解决此问题或其他建议

注意:请注意,ya是一个简单的测试方程我没有方程来处理信号,因此仅仅更改频率变量是不起作用的。

见下面的代码:

clear,clc
fs = 44100;                   % Sampling frequency
t=linspace(0,2*pi,fs);
freq=1;
ya = sin(freq*t)';  %please note that this is a simple test equation I won't have equations just the signal to work with.

num_per_sec=2 %works
%num_per_sec=2.1 %doesn't work
yb=repmat(ya,num_per_sec,1);%replicate matrix 
xxo=linspace(0,1,length(yb))'; %go from 0 to 1 sec can change speed by incr/decr 1
xxi=linspace(0,1,length(ya))'; %go from 0 to 1 sec and get total samplerate from total y value
yi_t=interp1(xxo,yb,xxi,'linear');

plot(yi_t)

您正试图使用浮点数呼叫
repmat
。很明显,它不会按你想要的方式工作
repmat
的预期操作是将特定维度复制一个整数次

因此,我可以建议的一件事是,可能会截断不等于1的倍数的信号,并将其叠加在复制信号的末尾。例如,如果要将一个信号复制2.4次,通常需要将整个信号复制两次,然后将信号长度的40%堆叠到阵列的末端。因此,您可以对信号总持续时间的40%进行采样,并将其放在复制信号的末尾

因为您有采样频率,所以这会告诉您信号每秒应包含多少个采样。同样地,计算出你有多少整数倍,然后通过取这个百分比乘以你的采样频率的下限来确定部分信号由多少个采样组成。然后从中采样,并将其叠加在信号末尾。例如,在我们的2.4示例中,我们将执行
floor(0.4*fs)
以确定从信号开始到复制信号结束需要提取的样本总数

大概是这样的:

%// Your code
clear, clc
fs = 44100; %// Define sampling frequency                 
t=linspace(0,2*pi,fs);
freq=1;
ya = sin(freq*t)'; %// Define signal

num_per_sec=2.1; %// Define total number of times we see the signal

%// New code
%// Get total number of integer times we see the signal
num_whole = floor(num_per_sec);

%// Replicate signal
yb=repmat(ya,num_whole,1);

%// Determine how many samples the partial signal consists of
portion = floor((num_per_sec - num_whole)*fs);

%// Sample from the original signal and stack this on top of replicated signal
yb = [yb; ya(1:portion)];

%// Your code
xxo=linspace(0,1,length(yb))'; 
xxi=linspace(0,1,length(ya))'; 
yi_t=interp1(xxo,yb,xxi,'linear');

如果信号长于fs,请确保将部分行更改为读取
party=floor((num_/u sec-num_total)*长度(ya))