插值信号从4秒到1秒

时间:2011-04-01 06:17:29

标签: matlab interpolation

我有一个信号,从0到4秒循环两次,我想插入信号,从0到1秒循环两次。我知道这是xi变量的问题;我只是不确定如何解决它。

这个例子只是一个简单的正弦波方程,但我将导入一个真正的音频wav文件;这就是我选择使用插值的原因。不幸的是,它不仅仅是一个简单的情节改变,因为它将是一个将被导入的音频文件,对其进行一些计算,然后作为另一个音频文件导出回来。

%Interpolation test
clear all, clc,clf,tic
x= linspace(0,2*pi,400); %from 0 to 4 sec
fs_rate=100
freq=2;
y=sin(freq*(x)); 

xo=linspace(0,length(y)/fs_rate,length(y)); %go from 0 to x sec 
xi=linspace(0,1,length(y)); %go from 0 to 1 sec 
new_y=interp1(xo,y,xi,'linear');

subplot(2,2,1),plot(xo,y),title('Orginal signal over 4 sec')
subplot(2,2,3),plot(xi,new_y),title('Entire signal over 1 sec')

我回去做了谢尔盖推荐的并使用了resample和repmat,但我注意到在某些值上,行与采样率不同(见下图)。

请注意,行的顶部图像值为1000,底部图像表示rows = 1008.当我更改resample和repmat(freq_new)的值但仅针对特定值时,会发生这种情况。我怎样才能解决这个问题?我可以在1000之后删除所有内容,但我不确定这是一个错误还是只是resample / repmat的工作方式。

http://dl.dropbox.com/u/6576402/questions/rows_different.png

以下是我用来测试的代码:

%resample_repmat signal
clear all, clf
Fs = 1000; % Sampling rate
Ts = 1/Fs; %sampling interval
t=0:Ts:1-Ts; %sampling period

freq_orig=1;
y=sin(2*pi*t*freq_orig)'; %gives a short wave

freq_new=9;
y2=resample(y,1,freq_new); %resample matrix
y3=repmat (y2,freq_new,1); %replicate matrix

[r_orig,c_orig] = size(y) %get orig number of rows and cols
[r_new,c_new] = size(y3) %get new number of rows and cols

subplot(2,1,1),plot(y),title('Orginal signal')
title(['rows=',num2str(r_orig),' cols=',num2str(c_orig)])
subplot(2,1,2),plot(y3),title('New signal')
title(['rows=',num2str(r_new),' cols=',num2str(c_new)])

2 个答案:

答案 0 :(得分:1)

我可能不完全理解这个问题,但这听起来并不像你真正对执行插值感兴趣,而只是在时间上压缩?只需将原始y与新的时间向量xi一起使用即可获得所需的结果:

plot(xi, y); title('Entire signal over 1 sec')

答案 1 :(得分:0)

您需要使用某种FFT。这是一个解释时间压缩方法的链接(第一个Google结果顺便说一句):http://dspdimension.com/admin/time-pitch-overview