# Conceptually confused by LPC for speech: Do we synthesize by the inverse filter (FIR)?

I've been following the process of using LPC to analyse the speech and then synthesize the speech by swapping out coefficients over time. I'm purely concerned with pitched vowels at this point.

lpc(speech_segment) gives us $$a_{p}$$ coefficients of an IIR filter, where $$p$$ is the order. This IIR filter has the frequency response of the speech vowel/formant present in speech_segment.

I have a pulse train to use as a source.

I see two ideologies for synthesis:

1. some texts talk about using the IIR filter to filter the source, which makes sense to me intuitively - juxtaposing the vowel's frequency response to my source's spectrum

2. Other texts talk about using the inverse of this IIR filter to form an FIR, and then filter the source somehow. I think I understand why this is invertible and stable (minimum-phase).

So approach 2 makes less sense to me from source-filter perspective, but it would be really useful because it means I can perform LPC analysis-synthesis with OLA convolution of audio blocks rather than implement the filter recursively.

Is my understanding of either of these two approaches, not quite right? If not, what exactly changes to make each possible.

• Don't bother with any of this, go directly to a deep learning approach. – FourierFlux Oct 27 '20 at 3:27
• oh, gee, @FourierFlux, and learn an entirely different computing discipline to apply to an existing and mostly solved problem space? – robert bristow-johnson Oct 27 '20 at 4:55

Given speech samples, the LPC computation yields linear prediction coefficients $$a_1,\ldots,a_p$$. These describe a dependence model for a few samples. It is assumed that for short-enough collections of speech samples, the process is modeled well by an autoregressive stochastic process and that each sample is well-approximated by the following estimate based on the previous $$p$$ samples: $$\begin{equation} \widehat{x}[n] = a_1x[n-1] + \cdots + a_px[n-p]. \end{equation}$$ The error is then $$\begin{equation} e[n] = x[n] - a_1x[n-1] - \cdots - a_px[n-p]. \end{equation}$$ This "error filter" has coefficients $$1, -a_1,\ldots,-a_p$$.

For un-voiced speech, it turns out that discrete-time white noise is a decent model for the error signal. Keep this in mind.

Rather than send all the samples, communication systems send these linear prediction coefficients$$^{\dagger}$$. As mentioned in the other answer, to generate an approximation of the original speech, the synthesizer either generates a pulse train or a white noise realization and sends it though the filter that is the inverse of the error filter. This inverse is an IIR filter with frequency response $$\begin{equation} H(e^{i\omega}) = \frac{1}{1 - a_1e^{-i\omega} - \cdots - a_pe^{-ip\omega}}. \end{equation}$$ The output of that IIR filter is an approximation of the original collection of speech samples.

$$\dagger$$ Vocoders do not really spit out linear prediction coefficients. They do not even spit out proxies such as reflection coefficients or line spectral pairs. They spit out integer indices of quantized versions of these coefficients. When these integers are received, the synthesizer grabs the appropriate entries in a lookup table and uses those as the coefficients.

The approach you describe is based on the source-filter model of speech production.

For speech synthesis you can use for source either a pulse train (to simulate glotal pulses in voiced sounds) or noise (for unvoiced sounds). After this you must use a filter (to simulate vocal tract).

However the source is not as simple as a pulse train or noise. So, you can better estimate the source by using a natural sound (a vowel in our case) and do inverse filtering. Then you can combine this source model with your filter and produce more natural sounding speech.
{"ft_lang_label":"__label__en","ft_lang_prob":0.9432949,"math_prob":0.9712478,"size":1175,"snap":"2021-04-2021-17","text_gpt3_token_len":248,"char_repetition_ratio":0.11699402,"word_repetition_ratio":0.010471204,"special_character_ratio":0.19914894,"punctuation_ratio":0.07906977,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9934301,"pos_list":[0],"im_url_duplicate_count":[null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2021-01-20T13:45:26Z\",\"WARC-Record-ID\":\"<urn:uuid:d65446b5-be76-4517-a3c1-6c8e645750a3>\",\"Content-Length\":\"160517\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:d6a95c8b-b695-4c16-b1ff-af5db5df89f3>\",\"WARC-Concurrent-To\":\"<urn:uuid:37955706-db5d-4128-a290-5fe80951634b>\",\"WARC-IP-Address\":\"151.101.65.69\",\"WARC-Target-URI\":\"https://dsp.stackexchange.com/questions/67917/conceptually-confused-by-lpc-for-speech-do-we-synthesize-by-the-inverse-filter/67936\",\"WARC-Payload-Digest\":\"sha1:WHC3EI2AUW5PMM5T6ELCSWLINSONDNWT\",\"WARC-Block-Digest\":\"sha1:RPJZVRRQWRRUHZA66U4S5ITL3UIGBOPU\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2021/CC-MAIN-2021-04/CC-MAIN-2021-04_segments_1610703520883.15_warc_CC-MAIN-20210120120242-20210120150242-00021.warc.gz\"}"}