diff --git a/func/autocorr.m b/func/autocorr.m index 4898686..6478bee 100644 --- a/func/autocorr.m +++ b/func/autocorr.m @@ -1,7 +1,7 @@ function [cep_autocorr, cep_lags] = autocorr(signal, max_lags, time, Fs) -[cep_autocorr, cep_lags] = xcorr(signal, max_lags, 'coeff'); -% [cep_autocorr, cep_lags] = xcorr(signal, 'coeff'); +% [cep_autocorr, cep_lags] = xcorr(signal, round(max_lags), 'coeff'); +[cep_autocorr, cep_lags] = xcorr(signal, 'coeff'); if time cep_lags = 1000*cep_lags/Fs; % turn samples into ms diff --git a/func/get_impulse_train.m b/func/get_impulse_train.m new file mode 100644 index 0000000..19d676a --- /dev/null +++ b/func/get_impulse_train.m @@ -0,0 +1,27 @@ +%% get_impulse_train.m +%% +%% Generate periodic impulse train for use in speech synth +%% +%% Signal of pitch fundamental_freq sampled at sampling_freq +%% for time length_ms +function signal = get_impulse_train(fundamental_freq, sampling_freq, length_ms) + +if fundamental_freq > sampling_freq + disp('Fundamental frequency greater than sampling_freq') + signal = []; + return +end + +required_samples = ms_to_samples(length_ms, sampling_freq); +pitch_period = 1 / fundamental_freq; +sample_period = 1 / sampling_freq; + +cell_length = round(pitch_period / sample_period); + +% cell to be repeated into periodic signal +pitch_cell = [1 zeros(1, cell_length - 1)]; +required_cells = ceil(required_samples / cell_length); + +signal = repmat(pitch_cell, 1, required_cells); +signal = signal(1:required_samples); +end diff --git a/func/spectro.m b/func/spectro.m index 53080ae..c05f5f4 100644 --- a/func/spectro.m +++ b/func/spectro.m @@ -2,13 +2,16 @@ function spectro(signal, sample_frequency, windows, overlap_interval) sample_overlap = ms_to_samples(overlap_interval, sample_frequency); -sample_size = size(signal); %window_size = round(sample_size(1) / ((windows + 1)/2)) % Turn windows into window width in samples, take into account overlap -window_size = round((sample_size(1) + (windows + 1) * sample_overlap) / (windows+1)); +window_size = round(... + (length(signal) + (windows + 1) * sample_overlap) ... + / ... + (windows+1) ... + ); -spectrogram(signal, window_size, sample_overlap, [], sample_frequency, 'yaxis'); +spectrogram(signal, window_size, round(sample_overlap), [], sample_frequency, 'yaxis'); end diff --git a/lpss.m b/lpss.m index b8e24d5..f02e09f 100644 --- a/lpss.m +++ b/lpss.m @@ -9,30 +9,52 @@ SEGMENT_OFFSET = 0; % ms from start LPC_ORDER = 20; AC_DISP_SAMPLES = 1000; % autocorrelation display samples -WINDOW_NUMBER = 10; +WINDOW_NUMBER = 10; % number of windows for spectrogram WINDOW_OVERLAP = 5; % ms +SYNTH_WINDOW_NUMBER = 100; % number of windows for spectrogram +SYNTH_WINDOW_OVERLAP = 10; % ms + +PREEMPHASIS_COEFFS = [1 -0.8]; % first order zero coeff for pre-emphasis F0 = 60; % low-pitched male speech % F0 = 600; % children % flags for selective running -FREQ_RESPONSE = ~false; +PREEMPHASIS = false; +CEPSTRUM_LOW_PASS = true; % smooth cepstrum for fund. freq. isolation +CEPSTRUM_LOW_PASS_COEFFS = [1 -0.7]; + +FREQ_RESPONSE = true; AUTOCORRELATION = false; -CEPSTRUM_PLOT = false; -CEPSTRUM_ONE_SIDED = true; + +CEPSTRUM_COMPLEX = false; % else real cepstrum +CEPSTRUM_PLOT = true; +CEPSTRUM_THRESHOLD = 0.075; % threshold for isolating peaks in cepstrum + ORIG_LPC_T_COMPARE = false; -ORIG_SPECTROGRAM = false; + +ORIG_SPECTROGRAM = true; +SYNTH_SPECTROGRAM = true; + +SYNTHESISED_SOUND_LENGTH = 500; % ms + PLAY = false; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% READ SIGNAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -[y, Fs] = audioread('samples/hood_m.wav'); +[y, Fs] = audioread('samples/head_f.wav'); +% take segment of sample for processing y = clip_segment(y, Fs, SEGMENT_LENGTH, SEGMENT_OFFSET); +y_orig = y; -L = length(y) % number of samples +if PREEMPHASIS + y = filter(PREEMPHASIS_COEFFS, 1, y); +end -max_lag = Fs/ F0; +L = length(y); % number of samples + +max_lag = Fs/ F0; % for autocorrelation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LPC @@ -47,12 +69,11 @@ if ORIG_LPC_T_COMPARE x = 1:AC_DISP_SAMPLES; AC_DISP_SAMPLES = min([AC_DISP_SAMPLES L]); +% plot t domain for original signal and estimation using LPC coeffs + figure(1) plot(x, y(end-AC_DISP_SAMPLES+1:end), x, est_y(end-AC_DISP_SAMPLES+1:end), '--') -% plot(x, y(end-DISPLAY_SAMPLES+1:end)) -% plot(x, est_y(end-DISPLAY_SAMPLES+1:end)) - grid xlabel('Sample Number') ylabel('Amplitude') @@ -62,12 +83,12 @@ end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% T DOMAIN PREDICTION ERROR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -t_domain_err = y - est_y; +t_domain_err = y - est_y; % residual? if AUTOCORRELATION figure(2) [acs, lags] = autocorr(t_domain_err, max_lag, true, Fs); -title('Autocorrelation for error in Time domain') +title('Autocorrelation of error in time domain') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -92,60 +113,114 @@ lpc_freq_plot = plot(filter_freqs, filter_vals_db, 'b'); lpc_freq_plot.LineWidth = 2; % MAXIMA +% estimate formant frequencies from maxima of LPC filter freq response maxima = islocalmax(filter_vals_db); maxima_freqs = filter_freqs(maxima) -maxima_db = filter_vals_db(maxima) +maxima_db = filter_vals_db(maxima); maxima_plot = plot(maxima_freqs, maxima_db, 'rx'); maxima_plot.MarkerSize = 12; maxima_plot.LineWidth = 2; +%% PRE_FILTER LPC +if PREEMPHASIS + [prefilter_vals, prefilter_freqs] = freqz(1, lpc(y_orig, LPC_ORDER), length(freq_dom_freqs), Fs); + + prefilter_plot = plot(prefilter_freqs, 20*log10(abs(prefilter_vals)), 'g'); + prefilter_plot.Color(4) = 0.8; + prefilter_plot.LineWidth = 1; +end + %% PLOT hold off grid xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') -legend('Original Signal', 'LPC Filter', 'LPC Maxima') +if PREEMPHASIS + legend('Original Signal', 'LPC Filter', 'LPC Maxima', 'LPC No Pre-emphasis') +else + legend('Original Signal', 'LPC Filter', 'LPC Maxima') +end title('Frequency Response For Speech Signal and LPC Filter') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% CEPSTRUM %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cep = rceps(y); -% cep = cceps(y); +if CEPSTRUM_COMPLEX + cep = cceps(y); +else + cep = rceps(y); +end +cep_filt = filter(1, CEPSTRUM_LOW_PASS_COEFFS, cep); -if CEPSTRUM_PLOT +if CEPSTRUM_PLOT % plot cepstrum in t domain ceps_t = (0:L - 1); -figure(4) -if CEPSTRUM_ONE_SIDED - plot(ceps_t(1:L / 2), cep(1:L / 2)) +if CEPSTRUM_LOW_PASS + c = cep_filt; else - plot(ceps_t(1:L), cep(1:L)) + c = cep; end +figure(4) +hold on +plot(ceps_t(1:round(L / 2)), c(1:round(L / 2))) + +%% MAXIMA +% value threshold +c(c < CEPSTRUM_THRESHOLD) = 0; +cep_maxima_indexes = islocalmax(c); + +cep_maxima_times = ceps_t(1:round(L / 2)); +cep_maxima_times = ceps_t(cep_maxima_indexes); +c = c(cep_maxima_indexes); + +% quefrency threshold +cep_time_indexes = 20 < cep_maxima_times; +cep_maxima_times = cep_maxima_times(cep_time_indexes); +c = c(cep_time_indexes); + +% 1st half +cep_half_indexes = cep_maxima_times <= round(L / 2); +cep_maxima_times = cep_maxima_times(cep_half_indexes); +c = c(cep_half_indexes); + +maxima_plot = plot(cep_maxima_times, c, 'rx'); +maxima_plot.MarkerSize = 8; +maxima_plot.LineWidth = 1.5; + grid xlabel('Quefrency') ylabel('ceps(x[n])') -if CEPSTRUM_ONE_SIDED - xlim([0 L / 2]) - title('One-sided Speech Signal Cepstrum') -else - xlim([0 L]) - title('Speech Signal Cepstrum') -end -end - -%% AUTOCORRELATION -if AUTOCORRELATION -figure(5) -[cep_autocorr, cep_lags] = autocorr(cep(1:L/2), max_lag, true, Fs); -title('One-sided Cepstrum Autocorrelation') +xlim([0 L / 2]) +title('Speech Signal Cepstrum') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% PLOT ORIGINAL SPECTROGRAM +%% CALCULATE FUNDAMENTAL FREQUENCY +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% CEPSTRUM +if CEPSTRUM_PLOT && length(cep_maxima_times) >= 1 + pitch_period = cep_maxima_times(c == max(c)); + fundamental_freq = 1 / (pitch_period / Fs) +else + disp('pitch periods not identified') +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% GENERATE SIGNAL +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +if exist('fundamental_freq') + excitation = get_impulse_train(fundamental_freq, Fs, SYNTHESISED_SOUND_LENGTH); + + synth_sound = filter(1, a, excitation); + + audiowrite('out.wav', synth_sound, Fs); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% SPECTROGRAM %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if ORIG_SPECTROGRAM figure(6) @@ -154,9 +229,20 @@ colormap bone title('Speech Signal Spectrogram') end +if SYNTH_SPECTROGRAM +figure(7) +spectro(synth_sound, Fs, SYNTH_WINDOW_NUMBER, SYNTH_WINDOW_OVERLAP); +colormap bone +title('Synthesised Vowel Sound Spectrogram') +end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% PLAY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if PLAY sound(y, Fs); +pause(1); +if exist('synth_sound') + sound(synth_sound, Fs); +end end \ No newline at end of file diff --git a/lpss_cepstrum.m b/lpss_cepstrum.m index 3c9dce2..093bb63 100644 --- a/lpss_cepstrum.m +++ b/lpss_cepstrum.m @@ -5,6 +5,12 @@ close all;clear all;clc; CEPSTRUM_COEFFS = 100; +CEPSTRUM_THRESHOLD = 0.1; +LOW_PASS_COEFF = 0.9; +F0 = 60; % low-pitched male speech +% F0 = 600; % children + +CEPSTRUM_FFT = false; % READ SIGNAL [y, Fs] = audioread('samples/hood_m.wav'); @@ -21,10 +27,11 @@ xlabel('Quefrency') ylabel('ceps(x[n])') % xlim([0 sample_length]) xlim([0 half]) +title('Cepstrum') %% PLOT FFT - -c = cceps(y); +if CEPSTRUM_FFT + c(CEPSTRUM_COEFFS:end) = 0; % [cep_freqs, cep_vals] = fft_(c, Fs); cep_vals = fft(c); @@ -32,6 +39,46 @@ cep_vals = cep_vals(1:floor(sample_length/2+1)); cep_freqs = Fs*(0:(sample_length/2))/sample_length; figure(2) -cep_plot = plot(cep_freqs, 20*log10(abs(cep_vals)), 'g'); +cep_plot = plot(cep_freqs, 20*log10(abs(cep_vals))); cep_plot.LineWidth = 2; -hold off \ No newline at end of file + +end + +%% SMOOTH CEPSTRUM + +a = [1 -LOW_PASS_COEFF]; +[filter_vals, filter_freqs] = freqz(1, a, 1000, Fs); + +figure(3) +plot(filter_freqs, 20*log10(filter_vals)); +xlabel('Frequency (Hz)') +ylabel('Amplitude (dB)') +title('Low Pass Filter Response') + +c_filt = filter(1, a, c); + +figure(4) +plot(t(1:half), c_filt(1:half)); +xlabel('Quefrency') +ylabel('ceps(x[n])') +title('Cepstrum Post-Low-Pass') + +%% AUTOCORELLATION +figure(5) +autocorr(c(1:half), Fs/F0, true, Fs); +title('Cepstrum Autocorrelation') + +figure(6) +[smooth_cep_autocorr, smooth_cep_lags] = autocorr(c_filt(1:half), Fs/F0, true, Fs); +title('Smoothed Cepstrum Autocorrelation') +hold on + +smooth_cep_autocorr(smooth_cep_autocorr < CEPSTRUM_THRESHOLD) = 0; + +maxima = islocalmax(smooth_cep_autocorr); +maxima_freqs = smooth_cep_lags(maxima) +maxima_db = smooth_cep_autocorr(maxima); + +maxima_plot = plot(maxima_freqs, maxima_db, 'rx'); +maxima_plot.MarkerSize = 8; +maxima_plot.LineWidth = 1.5; diff --git a/lpss_preemph.m b/lpss_preemph.m new file mode 100644 index 0000000..66c9ef8 --- /dev/null +++ b/lpss_preemph.m @@ -0,0 +1,45 @@ +%% lpss_preemph.m +%% +%% Load wav and play with preemphasis filter + +close all;clear all;clc; + +[y, Fs] = audioread('samples/hood_m.wav'); + +b = [1 -0.68]; + +[filter_vals, filter_freqs] = freqz(b, 1, 1000, Fs); + +%% PREEMPH FILTER RESPONSE +figure(1) +plot(filter_freqs, filter_vals); +xlabel('Frequency (Hz)') +ylabel('Amplitude') + +%% ORIGINAL FFT +[freq_dom_freqs, freq_dom_vals] = fft_(y, Fs); +figure(2) +plot(freq_dom_freqs, 20*log10(freq_dom_vals)); +xlabel('Frequency (Hz)') +ylabel('Amplitude') +title('Original spectrum') + +%% POST FILTER FFT +y_filt = filter(b, 1, y); +[freq_dom_freqs_post, freq_dom_vals_post] = fft_(y_filt, Fs); +figure(3) +plot(freq_dom_freqs_post, 20*log10(freq_dom_vals_post)); +xlabel('Frequency (Hz)') +ylabel('Amplitude') +title('Post-filter spectrum') + +%% BOTH +figure(4) +plot(freq_dom_freqs, 20*log10(freq_dom_vals), 'b'); +hold on +plot(freq_dom_freqs_post, 20*log10(freq_dom_vals_post), 'r--'); +hold off +xlabel('Frequency (Hz)') +ylabel('Amplitude') +legend('Original Signal', 'Filtered') +title('Post-filter spectrum') \ No newline at end of file diff --git a/lpss_synth.m b/lpss_synth.m new file mode 100644 index 0000000..2044523 --- /dev/null +++ b/lpss_synth.m @@ -0,0 +1,11 @@ +%% lpss.m +%% +%% Coursework script + +close all;clear all;clc; + +Fs = 24000; % Hz, sampling +Ff = 100; % Hz, fundamental +sample_length = 1000; % ms + +sample = get_impulse_train(Ff, Fs, sample_length) \ No newline at end of file diff --git a/report/report.lyx b/report/report.lyx index 997dd55..189720b 100644 --- a/report/report.lyx +++ b/report/report.lyx @@ -268,8 +268,8 @@ Brief \begin_layout Standard The aim of this report is to demonstrate how digital signal processing technique s can be used to analyse, model and synthesise speech. - The task will take will be considered as two areas of concern, that of - modelling and synthesis. + The task will be considered as two areas of concern, that of modelling + and synthesis. \end_layout \begin_layout Standard @@ -280,7 +280,7 @@ The modelling stage will utilise Linear Predictive Coding and the source-filter the original sound will be presented, the effect of different filter orders will also be demonstrated. Relevant parameters of the original vowel speech segment will be presented - including the fundamental frequency and further formant frequencies. + including the fundamental frequency and formant frequencies. \end_layout \begin_layout Standard @@ -296,10 +296,123 @@ d and analysed. Implementation \end_layout +\begin_layout Standard +The implementation of this system was completed using +\noun on +Matlab +\noun default + with aid from functions in the digital signal processing toolbox among + others. + Following loading a vowel sample, a segment of changing length (100ms was + standard) was clipped for processing. + The clip optionally also underwent pre-emphasis using a high pass filter. + As speech spectra can tend to have higher energy at lower frequencies, + the use of pre-emphasis can balance the magnitude across the spectrum. + A first order filter was used and the coefficient varied, over-use could + prove excessive for higher frequencies including fricative sounds. +\end_layout + +\begin_layout Subsection +Modelling +\end_layout + +\begin_layout Standard +In order to estimate the filter state of the vocal tract, the linear predictive + coding coefficients of varying orders were calculated using the +\begin_inset listings +lstparams "language=Matlab,basicstyle={\ttfamily},tabsize=4" +inline true +status open + +\begin_layout Plain Layout + +lpc(signal, order) +\end_layout + +\end_inset + + function. + In order to compare the frequency response of the LPC filter with the original + signal, the Fourier transform of the signal was calculated. + The frequency domain representation of the LPC filter was found using the + +\begin_inset listings +lstparams "language=Matlab,basicstyle={\ttfamily},tabsize=4" +inline true +status open + +\begin_layout Plain Layout + +freqz(b, a, n, f) +\end_layout + +\end_inset + + function and co-plotted with the original signal. + This frequency plot of the LPC filter constitutes the spectral envelope + of the signal and the vowel formant frequencies can be found at the maxima + of the spectrum. + Due to the smooth profile of the LPC spectrum, formant frequencies were + estimated by identifying the local maxima of the function. +\end_layout + +\begin_layout Standard +In order to find the fundamental frequency of the signal, the cepstrum was + used. + The use of a low pass filter was investigated in order to smooth the cepstrum + before programmatically finding pitch period candidates by applying +\begin_inset Formula $x$ +\end_inset + + and +\begin_inset Formula $y$ +\end_inset + + thresholds. +\end_layout + +\begin_layout Subsection +Synthesis +\end_layout + +\begin_layout Standard +In order to synthesise speech, a periodic impulse train at the identified + fundamental frequency of the original vowel was generated. + The impulse train was sampled at the same frequency as the original sound. +\end_layout + \begin_layout Section Results \end_layout +\begin_layout Subsection +LPC Filter +\end_layout + +\begin_layout Subsubsection +Order Variation +\end_layout + +\begin_layout Subsection +Spectral Analysis +\end_layout + +\begin_layout Subsubsection +Fundamental Frequency +\end_layout + +\begin_layout Subsubsection +Formant Frequencies +\end_layout + +\begin_layout Subsubsection +Cepstrum Smoothing +\end_layout + +\begin_layout Subsection +Synthesis +\end_layout + \begin_layout Section Discussion \end_layout @@ -346,15 +459,38 @@ name "sec:Code" \end_layout +\begin_layout Standard +While much of the code was developed in individual scripts in order to experimen +t with separate aspects of the system, for collecting results a script which + constitutes the entire system was written, +\begin_inset listings +lstparams "basicstyle={\ttfamily}" +inline true +status open + +\begin_layout Plain Layout + +lpss.m +\end_layout + +\end_inset + +. +\end_layout + \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../lpss.m" -lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram, mfcc, spectro, fft_, autocorr, clip_segment, islocalmax, ms_to_samples},caption={Main script},label={main_script}" +lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram, mfcc, spectro, fft_, autocorr, clip_segment, islocalmax, ms_to_samples, rceps, cceps, ones, audioplayer, play, get_impulse_train, lpc},caption={Main script including source-filter model and spectral analysis},label={main_script}" \end_inset +\begin_inset Newpage pagebreak +\end_inset + + \end_layout \begin_layout Standard @@ -394,7 +530,7 @@ lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},comm \begin_inset CommandInset include LatexCommand lstinputlisting filename "../func/clip_segment.m" -lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram},caption={Retrieve a segment of the original speech signal},label={clip_segment_function}" +lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram, ms_to_samples},caption={Retrieve a segment of the original speech signal},label={clip_segment_function}" \end_inset @@ -405,7 +541,18 @@ lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},comm \begin_inset CommandInset include LatexCommand lstinputlisting filename "../func/ms_to_samples.m" -lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram},caption={Transform time in milliseconds into the respective number of samples},label={clip_segment_function-1}" +lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram},caption={Transform time in milliseconds into the respective number of samples},label={ms_to_samples_function}" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand lstinputlisting +filename "../func/get_impulse_train.m" +lstparams "breaklines=true,frame=tb,language=Matlab,basicstyle={\\ttfamily},commentstyle={\\color{commentgreen}\\itshape},keywordstyle={\\color{blue}},emphstyle={\\color{red}},stringstyle={\\color{red}},identifierstyle={\\color{cyan}},morekeywords={audioread, aryule, xcorr, freqz, spectrogram, ms_to_samples, repmat},caption={Generate an impulse rate of given fundamental frequency at a provided sampling frequency for a given length of time},label={get_impulse_train_function}" \end_inset