first commit
This commit is contained in:
88
Lab/Lab3/requirements/pitch.m
Normal file
88
Lab/Lab3/requirements/pitch.m
Normal file
@@ -0,0 +1,88 @@
|
||||
clc;clear all;close all;
|
||||
warning('off')
|
||||
%[x,fs,nbits]=wavread('tang1.wav'); %<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||
global fs;
|
||||
[x,fs] = audioread('tang1.wav'); %<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||
%info = audioinfo('tang1.wav');
|
||||
%nbits = info.BitsPerSample;
|
||||
x = x / max(abs(x)); %<EFBFBD><EFBFBD><EFBFBD>ȹ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>[-1,1]
|
||||
|
||||
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
kl = round(1 / 500 * fs); %500Hz
|
||||
kr = round(1 / 80 * fs); %80Hz
|
||||
N = 3 * kr; %֡<EFBFBD><EFBFBD>
|
||||
inc = round(fs / 100); %֡<EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD>10ms
|
||||
|
||||
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
||||
subplot(3, 1, 1);
|
||||
plot(x);
|
||||
axis([1 length(x) -1 1]) %<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>Χ<EFBFBD><EFBFBD>
|
||||
xlabel('֡<EFBFBD><EFBFBD>');
|
||||
ylabel('Speech');
|
||||
legend('FrameLen = 552');
|
||||
|
||||
%<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>ѡ<EFBFBD>㼯
|
||||
subplot(3, 1, 2);
|
||||
A = enframe(x, N, inc);
|
||||
R = zeros(size(A));
|
||||
l = zeros(1, size(R, 1));
|
||||
f = zeros(1, size(R, 1));
|
||||
Can = zeros(1, 10);
|
||||
acCan = zeros(1, 10);
|
||||
CostF = zeros(1, 10);
|
||||
it = 0;
|
||||
for n = 1:size(R, 1)
|
||||
R(n, :) = autocorr(A(n, :), N - 1);
|
||||
Can_ = Can;
|
||||
CostF_ = CostF;
|
||||
[acCan,Can] = findpeaks(R(n, kl:kr), 'MinPeakHeight', R(n, 1) * 0.25, 'MinPeakProminence', 0.9);
|
||||
Can = Can + kl - 1;
|
||||
sz = size(Can, 2);
|
||||
if sz ~= 0
|
||||
it = it + 1;
|
||||
if it == 1
|
||||
CostF = dist(acCan);
|
||||
else
|
||||
CostF = zeros(1, sz);
|
||||
Path = zeros(1, sz);
|
||||
CostT = diff(Can, Can_);
|
||||
for j = 1:sz
|
||||
[CostF(j), Path(j)] = min(CostF_ + CostT(j, :));
|
||||
CostF = CostF + dist(acCan);
|
||||
end
|
||||
end
|
||||
[~, l(n)] = min(CostF);
|
||||
ff = f0(Can);
|
||||
plot(n, ff, '.');
|
||||
hold on;
|
||||
f(n) = ff(l(n));
|
||||
else
|
||||
it = 0;
|
||||
end
|
||||
end
|
||||
|
||||
subplot(3, 1, 3);
|
||||
f = medfilt1(f, 5);
|
||||
stem(f, 'MarkerSize',3);
|
||||
xlabel('֡<EFBFBD><EFBFBD>(n)');
|
||||
ylabel('Ƶ<EFBFBD><EFBFBD>(Hz)');
|
||||
|
||||
function f = f0(Can)
|
||||
global fs;
|
||||
f = fs ./ Can;
|
||||
end
|
||||
|
||||
function dis = dist(ac)
|
||||
dis = -log(ac);
|
||||
end
|
||||
|
||||
function df = diff(Can1, Can2)
|
||||
n = size(Can1, 2);
|
||||
m = size(Can2, 2);
|
||||
df = zeros(n, m);
|
||||
for i = 1:n
|
||||
for j = 1:m
|
||||
df(i, j) = abs(f0(Can1(i)) - f0(Can2(j)));
|
||||
end
|
||||
end
|
||||
end
|
||||
BIN
Lab/Lab3/requirements/pitch实验报告-参考.pdf
Normal file
BIN
Lab/Lab3/requirements/pitch实验报告-参考.pdf
Normal file
Binary file not shown.
BIN
Lab/Lab3/requirements/tang1.wav
Normal file
BIN
Lab/Lab3/requirements/tang1.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user