Интерполяционный сигнал от 4 с до 1 с - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть сигнал, который циклически повторяется от 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')

Я вернулся и сделал то, что рекомендовал Сергей, и использовал повторную выборку и повтор, но я заметил, что для некоторых значений строки не совпадают с частотой дискретизации (см. Изображение ниже).

Обратите внимание, что верхнее значение изображения для строк говорит о 1000, а нижнее изображение говорит о строках = 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 ]

1 голос
/ 01 апреля 2011

Возможно, я не до конца понимаю вопрос, но не похоже, что вы на самом деле заинтересованы в выполнении интерполяции, а скорее во сжатии во времени? Вы должны получить желаемый результат, просто используя исходный y с новым вектором времени xi:

plot(xi, y); title('Entire signal over 1 sec')
0 голосов
/ 01 апреля 2011

Вы захотите использовать какой-нибудь БПФ . Вот ссылка, которая объясняет некоторые методы сжатия времени (1-й результат Google между прочим): http://dspdimension.com/admin/time-pitch-overview.

...