开发者

Interpolating signal from 4 sec to 1 sec

I have a signal that cycles twice from 0 to 4 seconds and I would like to interpolate the signal to cycle twice when it goes from 0 to 1 second. I know it's an issue with my xi variable; I'm just not sure how to fix it.

The example is just a simple sine wave equation but I'll be importing an audio wav file in the real one; that's why I chose to use interpolate. Unfortunately it can't just be a simple plot change due to the fact it will be an audio file that will be imported, some calculations done on it, then exported back out as another audio file.

%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')

I went back and did what Sergei recommended and used resample and repmat, but I'm noticing that on some of the values the rows aren't the same as the sample rate (see image below).

Notice the top image value for rows says 1000 and the bottom image says rows = 1008. This happens when I change the values of resample and repmat (freq_new) but only for certain values. How can I fix this? I could just delete everything after 1000 but I'm not sure if this is a bug or just the way resample/repmat works.

Interpolating signal from 4 sec to 1 sec

Here's the code I used to test this:

%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')
titl开发者_StackOverflow中文版e(['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)])


I might not fully understand the question, but it doesn't sound like you're actually interested in performing an interpolation, but rather just a compression in time? You should get your desired result by just using the original y with your new time vector xi:

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


You'll want to use some kind of FFT. Here is a link that explains some methods for time compression (1st Google result btw): http://dspdimension.com/admin/time-pitch-overview.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜