#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)');