使用插值和重构来改变八度音和matlab中信号的频率

时间:2015-06-22 22:01:50

标签: arrays matlab signal-processing octave

我正在使用Octave 3.8.1,就像matlab一样,我正在尝试使用插值和重新匹配来改变信号的频率(因为它这么快就这样做(.01秒)而我必须一次创建28000+ 我可以将变量num_per_sec更改为任何整数但是如果我尝试将其更改为2.1或其中包含小数的任何内容我会收到错误 “错误:重塑:无法重塑44100x2数组到92610x1数组错误:调用来自:第10行(重做行)”是否有人为此或其他建议解决了问题?

注意:请注意 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)

1 个答案:

答案 0 :(得分:2)

您正尝试使用浮点数调用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');