From: Joe on
I was asked to create a Decimator/Interpolator to go between
Narrow Band (8 KHz Sampling) and Wide Band (16 KHz Sampling).

I am not so familiar with english engineer lingo, so does the above mean
that the samplerate of the input signal which is fed to the
decimator/interpolator-algorithm will either be 8KHz or 16KHz ?

The implementation will be done in ANSI C. It has to a be a fixed point
implementation and it must be efficient in terms of cpu usage.

The implementation must support multi-instance. I'm assuming that this means
that it should be possible to create several instances of a
decimator/interpolator "class" and
that the implementation should be somewhat object-oriented?

The Decimator must have a passband of 3700 Hz. Stop Band is 4000 Hz. Minimum
stopband attenuation 40 dB. Passband ripple 1.5 dB.

I understand that the decimator is a preprocessing low pass filter and that
you send the input signal
through this filter...and that you then take every Mth output sample from
the filter to
construct the downsampled signal.

I also understand that the interpolator is a post-processing low-pass filter
which you apply to a signal x[k]
where x[k] is an 'expanded' version of some input signal y[k]....x[k] is
created by inserting zeros between
every sample in the original signal y[k].

I also understand that interpolation is done before decimation.

I tried to do a simulation in matlab and it seems to work fine:

********* MATLAB CODE START **********
%% 22050Hz signal
[y,fs]=wavread('audiosignal.wav');

%% Interpolator
L = 2; % Interpolation factor
Fp = 0.92*fs/2; % Passband-edge frequency
Fst = fs/2; % Stopband-edge frequency
Ap = 1.5; % Passband peak-to-peak ripple
Ast = 40; % Minimum stopband attenuation
Fs = fs; % Sampling frequency
Hf = fdesign.interpolator(L,'lowpass',Fp,Fst,Ap,Ast,Fs);
Hm = design(Hf,'equiripple');

% Create interpolated signal. New sample rate = 44100 Hz
z_i=zeros(1,length(y)*L);
z_i(1:L:end)=y;
z_i=filter(Hm.Numerator,1,z_i);
wavplay(z_i,fs*L);

%% Decimator
M = 6; % Decimation factor
Fp = 3700; % Passband-edge frequency
Fst = 4000; % Stopband-edge frequency
Ap = 1.5; % Passband peak-to-peak ripple
Ast = 40; % Minimum stopband attenuation
Fs = fs*L; % Sampling frequency
Hf = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs);
Hm = design(Hf,'equiripple');

% Create decimated signal and play it. New sample rate = 7350Hz
z=filter(Hm.Numerator,1,z_i);
z=z(1:M:end);
wavplay(z,fs*L/M);
********* MATLAB CODE END**********

Since the filter coefficients depend on fs, I am wondering why the spec I
was given doesn't say anything
about the sample frequency of the input signal. Should I just assume that I
also have to implement an
algorithm which calculates the filter coefficients based on some fs
specified by the user ? If it's a mistake
and fs is known and fixed, I guess it should have been included in the spec?
Or is the sample rate just either
8KHz or 16KHz (as mentioned in the beginning of this thread) ? In that case,
the decimator filter coefficients
still have to be calculated by some algorithm since they depend on the
interpolator factor L, right?









From: Jerry Avins on
On 5/29/2010 12:28 PM, Joe wrote:
> I was asked to create a Decimator/Interpolator to go between
> Narrow Band (8 KHz Sampling) and Wide Band (16 KHz Sampling).
>
> I am not so familiar with english engineer lingo, so does the above mean
> that the samplerate of the input signal which is fed to the
> decimator/interpolator-algorithm will either be 8KHz or 16KHz ?
>
> The implementation will be done in ANSI C. It has to a be a fixed point
> implementation and it must be efficient in terms of cpu usage.
>
> The implementation must support multi-instance. I'm assuming that this
> means
> that it should be possible to create several instances of a
> decimator/interpolator "class" and
> that the implementation should be somewhat object-oriented?
>
> The Decimator must have a passband of 3700 Hz. Stop Band is 4000 Hz.
> Minimum
> stopband attenuation 40 dB. Passband ripple 1.5 dB.
>
> I understand that the decimator is a preprocessing low pass filter and
> that you send the input signal
> through this filter...and that you then take every Mth output sample
> from the filter to
> construct the downsampled signal.
>
> I also understand that the interpolator is a post-processing low-pass
> filter which you apply to a signal x[k]
> where x[k] is an 'expanded' version of some input signal y[k]....x[k] is
> created by inserting zeros between
> every sample in the original signal y[k].
>
> I also understand that interpolation is done before decimation.
>
> I tried to do a simulation in matlab and it seems to work fine:
>
> ********* MATLAB CODE START **********
> %% 22050Hz signal
> [y,fs]=wavread('audiosignal.wav');
>
> %% Interpolator
> L = 2; % Interpolation factor
> Fp = 0.92*fs/2; % Passband-edge frequency
> Fst = fs/2; % Stopband-edge frequency
> Ap = 1.5; % Passband peak-to-peak ripple
> Ast = 40; % Minimum stopband attenuation
> Fs = fs; % Sampling frequency
> Hf = fdesign.interpolator(L,'lowpass',Fp,Fst,Ap,Ast,Fs);
> Hm = design(Hf,'equiripple');
>
> % Create interpolated signal. New sample rate = 44100 Hz
> z_i=zeros(1,length(y)*L);
> z_i(1:L:end)=y;
> z_i=filter(Hm.Numerator,1,z_i);
> wavplay(z_i,fs*L);
>
> %% Decimator
> M = 6; % Decimation factor
> Fp = 3700; % Passband-edge frequency
> Fst = 4000; % Stopband-edge frequency
> Ap = 1.5; % Passband peak-to-peak ripple
> Ast = 40; % Minimum stopband attenuation
> Fs = fs*L; % Sampling frequency
> Hf = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs);
> Hm = design(Hf,'equiripple');
>
> % Create decimated signal and play it. New sample rate = 7350Hz
> z=filter(Hm.Numerator,1,z_i);
> z=z(1:M:end);
> wavplay(z,fs*L/M);
> ********* MATLAB CODE END**********
>
> Since the filter coefficients depend on fs, I am wondering why the spec
> I was given doesn't say anything
> about the sample frequency of the input signal. Should I just assume
> that I also have to implement an
> algorithm which calculates the filter coefficients based on some fs
> specified by the user ? If it's a mistake
> and fs is known and fixed, I guess it should have been included in the
> spec? Or is the sample rate just either
> 8KHz or 16KHz (as mentioned in the beginning of this thread) ? In that
> case, the decimator filter coefficients
> still have to be calculated by some algorithm since they depend on the
> interpolator factor L, right?

Please be a little more explicit. When you write "go between
Narrow Band (8 KHz Sampling) and Wide Band (16 KHz Sampling)", I take it
that you mean that signals with a sample rate of 8KHz must be converted
to 16 KHz, and signals with a sample rate of 16KHz must be converted to
8 KHz. If so, the sample rates are given. Likewise the interpolation and
decimation factors; both 2.

If your task is as I suppose, then the interpolating 8 Ks/sec to 16 is
done by inserting a zero sample between each pair of original samples,
then filtering the resulting 16Ks/sec stream to remove any frequencies
not in the original, namely those above 4 KHz. This task requires a
(something less than) 4 KHz low-pass filter running at 16 Hs/sec.

Similarly decimating the 16 Ks/sec signal begins with the filter
described above, since the signal may have frequencies present that
can't be represented at the lower sample rate. Once that is done, delete
alternate samples to halve the sample rate.

Or did I not understand the requirements?

Jerry
--
Engineering is the art of making what you want from things you can get.
�����������������������������������������������������������������������
From: Jerry Avins on
On 5/29/2010 12:50 PM, Jerry Avins wrote:

...

> (something less than) 4 KHz low-pass filter running at 16 Hs/sec.

(something less than) 4 KHz low-pass filter running at 16 Ks/sec.
��
...

Jerry
--
Engineering is the art of making what you want from things you can get.
�����������������������������������������������������������������������
From: Fred Marshall on
You might use exactly the same filter in each case (but with different
sample rates).

Note: the filter coefficients *don't* depend on the sample rate but the
absolute frequency response does. If you normalize the frequency
response to fs, then the frequency response remains the same with the
same set of coefficients.

You might use the same half-band filter in both situations. A half-band
filter is a lowpass at fs/4 with some special features included.

For interpolation:

1) Intersperse in time with zeros. This may be a "no-op" depending on
your implementation.

2) Low pass filter (at the new fs) to fs/4 in order to get rid of the
content around fs/2 (which is an image of the content around zero and
fs). This is what a half-band filter does.

One benefit of the half-band filter is that it has quite a few
zero-valued coefficients. So, implementation in time can be efficiently
done.

For decimation:

1) Low pass filter at fs/4 in order to limit the bandwidth to below what
will become the *new* fs/2.

2) Decimate by dropping every other sample. Again, almost a "no-op".

Halfband design program at:
ftp.mission-systems-inc.com
login: ourguest
password: hellothere.4
Directory: Halfband

Fred


From: Jerry Avins on
On 5/29/2010 1:10 PM, Fred Marshall wrote:
> You might use exactly the same filter in each case (but with different
> sample rates).
>
> Note: the filter coefficients *don't* depend on the sample rate but the
> absolute frequency response does. If you normalize the frequency
> response to fs, then the frequency response remains the same with the
> same set of coefficients.
>
> You might use the same half-band filter in both situations. A half-band
> filter is a lowpass at fs/4 with some special features included.
>
> For interpolation:
>
> 1) Intersperse in time with zeros. This may be a "no-op" depending on
> your implementation.
>
> 2) Low pass filter (at the new fs) to fs/4 in order to get rid of the
> content around fs/2 (which is an image of the content around zero and
> fs). This is what a half-band filter does.
>
> One benefit of the half-band filter is that it has quite a few
> zero-valued coefficients. So, implementation in time can be efficiently
> done.
>
> For decimation:
>
> 1) Low pass filter at fs/4 in order to limit the bandwidth to below what
> will become the *new* fs/2.
>
> 2) Decimate by dropping every other sample. Again, almost a "no-op".
>
> Halfband design program at:
> ftp.mission-systems-inc.com
> login: ourguest
> password: hellothere.4
> Directory: Halfband

Fred,

I supposed that a half-band filter might fall short of the needed
performance. Isn't the attenuation at fs/4 only 3 dB?

Jerry
--
Engineering is the art of making what you want from things you can get.
�����������������������������������������������������������������������