Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

formant detection via lpc method - explanation of algoritm

Status
Not open for further replies.

mosol2005

Newbie level 4
Joined
Jul 30, 2009
Messages
7
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,346
lpc algorithm explain

hi every one .sorry for my poor english.i'm working on 'formant detection via lpc method'.i've found something but i cant understand it.can anybody explain it's algorithm.please.it's necessrary.also i can't run it

Formants Detection via LPC Method
LPC
% NAME
% spLpc - The linear predictive coding (one-step finite observation
% wiener filter prediction)
% SYNOPSIS
% [a P e] = spLpc(x, fs, ncoef, show)
% DESCRIPTION
% Obtain LPC coefficients (AR model)
% INPUTS
% x (vector) of size Nx1 which contains signal
% fs (scalar) the sampling frequency
% [ncoef] (scalar) the number of coefficients. The default uses
% ncoef = 2 + fs / 1000;
% as a rule of thumb.
% OUTPUTS
% a (vector) of size ncoefx1 which contains LPC coefficients
% P (scalar) variance (power) of the prediction error
% e (vector) of size Nx1 which contains residual error signals
% AUTHOR
% Naotoshi Seo, April 2008
% USES
% lpc.m (Signal Processing toolbox)
function [a P e] = spLpc(x, fs, ncoef)
if ~exist('ncoef', 'var') || isempty(ncoef)
ncoef = 2 + round(fs / 1000); % rule of thumb for human speech
end
[a P] = lpc(x, ncoef);
if nargout > 2,
est_x = filter([0 -a(2:end)],1,x); % Estimated signal
e = x - est_x; % Residual signal
end
end[x, fs] = wavread('bee.wav');
a = spLpc(x, fs, [], 'plot');Formants Detection
% NAME
% spFormantsLpc - Formants Estimation via LPC Method
% SYNOPSIS
% [F] = spFormantsLpc(a, fs)
% DESCRIPTION
% Estimate formants frequencies
% INPUTS
% a (vector) of size ncoefx1 which contains the LPC coefficients
% of the original signal. Use spLpc.m
% fs (scalar) the sampling frequency of the original signal
% OUTPUTS
% F (vector) of size ncoefx1 which contains formants
% AUTHOR
% Naotoshi Seo, April 2008
% SEE ALSO
% spLpc.m
function [F] = spFormantsLpc(a, fs)
r = roots(a);
r = r(imag(r)>0.01);
F = sort(atan2(imag(r),real(r))*fs/(2*pi));
endFormants Tracking in Short-Time Frames
% NAME
% spFormantsTrackLpc: Formants Tracking via the LPC Method
% SYNOPSIS
% [F, T] = spFormantsTrackLpc(x, fs, ncoef,
% frame_length, frame_overlap, window, show)
% DESCRIPTION
% Formants Tracking via the LPC method
% INPUTS
% x (vector) of size Nx1.
% fs (scalar) the sampling rate in Hz.
% [ncoef](scalar) the number of LPC coefficients used for
% estimation. ncoef = 2 + fs / 1000 is the default.
% [frame_length]
% (scalar) the length of each frame in micro second.
% The default is 30ms.
% [frame_overlap]
% (scalar) the length of each frame overlaps in micro second.
% The default is frame_length / 2.
% [window]
% (string) the window function such as rectwin, hamming.
% if not specified, equivalent to hamming
% [show] (boolean) plot or not. The default is 0.
% OUTPUTS
% F (vector) formants (fm = F(find(T == 0.01))
% T (vector) formant times
% AUTHOR
% Naotoshi Seo, April 2006
function [F, T] = spFormantsTrackLpc(x, fs, ncoef, frame_length, frame_overlap, window, show)
%% Initialization
N = length(x);
if ~exist('frame_length', 'var') || isempty(frame_length)
frame_length = 30;
end
if ~exist('frame_overlap', 'var') || isempty(frame_overlap)
frame_overlap = 20;
end
if ~exist('window', 'var') || isempty(window)
window = 'hamming';
end
if ~exist('show', 'var') || isempty(show)
show = 0;
end
if ~exist('ncoef', 'var')
ncoef = [];
end
nsample = round(frame_length * fs / 1000); % convert ms to points
noverlap = round(frame_overlap * fs / 1000); % convert ms to points
window = eval(sprintf('%s(nsample)', window)); % e.g., hamming(nfft)

pos = 1; t = 1;
F = []; % formants
T = []; % time (s) at the frame
mid = round(nsample/2);
while (pos+nsample <= N)
frame = x(pos:pos+nsample-1);
frame = frame - mean(frame);
a = spLpc(frame, fs, ncoef);
fm = spFormantsLpc(a, fs);
for i=1:length(fm)
F = [F fm(i)]; % number of formants are not same for each frame
T = [T (pos+mid)/fs];
end
pos = pos + (nsample - noverlap);
t = t + 1;
end

if show
% plot waveform
t=(0:N-1)/fs;
subplot(2,1,1);
plot(t,x);
legend('Waveform');
xlabel('Time (s)');
ylabel('Amplitude');
xlim([t(1) t(end)]);

% plot formants trace
subplot(2,1,2);
plot(T, F, '.');
hold off;
legend('Formants');
xlabel('Time (s)');
ylabel('Frequency (Hz)');
xlim([t(1) t(end)]);
end[x, fs] = wavread('bee.wav');
[F, T] = spFormantsTrackLpc(x, fs, [], 30, 20, 'hamming', 'plot');
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top