MATLAB xcorr разного размера сигналов

#matlab #audio #mp3

#matlab #Аудио #mp3

Вопрос:

Я пытаюсь создать проект, подобный shazam, но я застрял. Я хочу загрузить шаблонные сигналы (то есть песни), и когда я загружаю какую-то часть песни, она должна сравнивать шаблонные сигналы и говорить, что это ваша песня.Я думаю, что использую функцию xcorr, но когда я использую ее, matlab выдает ошибку, например, размер векторов должен быть одинаковым.Очевидно, что мои шаблонные песни и сигнал, который я пытаюсь сравнить с ними, имеют разный размер.Итак, что мне делать? Должен ли я использовать какую-то другую функцию, чем xcorr, или что я могу сделать по-другому? и это мой блок кода:

 [y,fs] = audioread('sound.wav');
[y2,fs2] = audioread('sound4.mp3');

y = y(:,1);
y2 = y2(:,1);
dt = 1/fs;
t = 0:dt:(length(y)*dt)-dt;
figure(1);
subplot(2,1,1);
plot(t,y); xlabel('Seconds'); ylabel('Amplitude');         %time domain
subplot(2,1,2);
plot(psd(spectrum.periodogram,y,'Fs',fs,'NFFT',length(y)));%frequency domain

figure(2);
subplot(2,1,1);
plot(t,y2); xlabel('Seconds'); ylabel('Amplitude');         %time domain
subplot(2,1,2);
plot(psd(spectrum.periodogram,y2,'Fs',fs,'NFFT',length(y2)));%frequency domain

[C1,lag1] = xcorr(y,y2);
C1_new = C1./max(abs(C1(:)));

figure(3);
ax(1) = subplot(211);
plot(lag1/fs,C1_new,'k');
ylabel('Normalized Amplitude');
grid on;
title('cross corre')
xlabel('time (second)');

 

Комментарии:

1. Если вы получаете ошибку, похожую на Error using coder.internal.assert (line 33) When B is a vector, A must be a vector. нее, предположите, что два файла suond имеют разное количество каналов. Например 'sound.wav' , может быть стерео, в то время 'sound4.mp3' как моно

Ответ №1:

Быстрое моделирование сигнала y и y2 разной длины показывает, что это не ошибка xcorr . Скорее, ошибка, которую вы получаете Error using plot Vectors must be the same length. , проистекает отсюда plot(t,y2);

Вы не можете использовать t для построения y2 графика, если y2 длина отличается от y

Предложение

Создайте второй t вектор, t2 , и сделайте его длиной y2

 [y,fs] = audioread('sound.wav');
[y2,fs2] = audioread('sound4.mp3');

y = y(:,1);
y2 = y2(:,1);
dt = 1/fs;
t = 0:dt:(length(y)*dt)-dt;
t2 = 0:dt:(length(y2)*dt)-dt;

figure(1);
subplot(2,1,1);
plot(t,y); xlabel('Seconds'); ylabel('Amplitude');         %time domain
subplot(2,1,2);
plot(psd(spectrum.periodogram,y,'Fs',fs,'NFFT',length(y)));%frequency domain

figure(2);
subplot(2,1,1);
plot(t2,y2); xlabel('Seconds'); ylabel('Amplitude');         %time domain
subplot(2,1,2);
plot(psd(spectrum.periodogram,y2,'Fs',fs,'NFFT',length(y2)));%frequency domain

[C1,lag1] = xcorr(y,y2);
C1_new = C1./max(abs(C1(:)));

figure(3);
ax(1) = subplot(211);
plot(lag1/fs,C1_new,'k');
ylabel('Normalized Amplitude');
grid on;
title('cross corre')
xlabel('time (second)');