AUTO 3310 - Digital Signal Processors

AUTO 3310 - Digital Signal
Processors
PDF generated using the open source mwlib toolkit. See http://code.pediapress.com/ for more information.
PDF generated at: Tue, 31 Jan 2012 10:09:50 UTC
Contents
Articles
Introduction
AUTO3310
Lectures
Digitaalisen suodattimen suunnittelu
1
1
4
4
Suodatintyyppejä
11
Suodattimen suunnittelu
12
Kiinteän pilkun luvut
14
Signaaliprosessorit
24
Assembler ja C kieli
28
IIR-suodattimen osittaminen
32
Monitaajuussignaalinkäsittely
38
Kertauskysymyksiä
40
Excercises
42
Digital filter design with Octave/MATLAB
42
CCSV sanastoa
44
Laskuharjoitus 1
44
Laskuharjoitus 2
45
FIR suodattimen integrointi audiofilter koodiin DSP:llä
47
Laskuharjoitus 3
51
Ensimmäinen TMS32C5515 sovellus
51
Laboratory
53
C55xx ChipSupportLibrary
53
Keskeytysten käyttö
54
USBSTK5515-käyttöliittymälevy
59
Funktiogeneraattori
59
Flanger
62
Jakosuodin
63
References
Article Sources and Contributors
64
Image Sources, Licenses and Contributors
65
Article Licenses
License
66
1
Introduction
AUTO3310
Signaaliprosessorit
Uutisia
• TI 12.12.2011: Välikoe!
• Ratkaisu viime perjantain (9.12.2011) ongelmaan, on sivulla FIR suodattimen integrointi audiofilter koodiin
DSP:llä
• PE 9.12.2011: HUOM! Pääsen harkkoihin vasta noin kello kymmenen. Aloita omaan tahtiin integroimaan
FIR-suodatinta DSP-kortin koodiin [[1]]
• PE 11.11.2011: HUOM! Pääsen harkkoihin vasta kello 10:00. Aloita omaan tahtiin tämän sivun kohdasta CCSv4
lisenssipalvelimen asettaminen ja jatka kohdasta Code Composer Studion käyttö
• [National instrumentsin LabView seminaari Vaasassa [2]], Radisson SAS-hotellissa tämän viikon torstaina,
10.11.2011 kello 9:00 alkaen. Seminaari on Central-hotellin puolella, osoitteessa Hovioikeudenpuistikko 21.
Muista ilmoittautua [täällä [3]]
Kurssikirja
[Kurssikirja Sanjit K. Mitra, Digital Signal Processing - A computer Based Approach [4]]
Sisällys:
Topics
• Digitaalisen suodattimen suunnittelu (Filter design)
• [FIR suodattimen suunnittelu [5]] by [Tapio Saramäki [6]]
• [IIR suodattimen suunnittelu [7]] by [Tapio Saramäki [6]]
• Suodatintyyppejä
• Suodattimen suunnittelu
• Kiinteän pilkun luvut (Fixed point numbers)
• Signaaliprosessorit (Signal processors)
• CodeComposer Studio ja USBSTK5515
• Assembler ja C kieli
• IIR-suodattimen osittaminen
• Monitaajuussignaalinkäsittely (Multi rate signal processing)
• Kertauskysymyksiä
AUTO3310
Tools
•
•
•
•
Ensimmäinen Labview Projekti
CCSv4 lisenssipalvelimen asettaminen
[CCSv4 wiki [8]]
Octave
• Windowssille: Downloudaa octave installer [[9]]
• Windowsille kannattaa asentaa myös GuiOctave [[10]]
• Linuxille: apt-get install octave octave-signal octave-optim
• [Digital filter design with LabView [11]] Requires NI LabVIEW Digital Filter Design Toolkit :(
• Digital filter design with Octave/MATLAB
• CCSV sanastoa
Code Composer Studion käyttö
• Aloitus:
• Katso tämä demo [video [12]]
• Käynnistä Code Composer studio. Tee aluksi itsellesi sopiva työhakemisto (Workspace). Tee työhakemisto
paikallisen koneen levylle, oman Desktoppisi alle. Jos yrität käyttää verkkolevyn hakemistoa muodossa, jossa
serverin nimi on mukana, CCS sanoo että: UNC paths are not supported ja kääntäminen ei onnistu
• Tee sitten vastaava Hello world sovellus, mutta käännä se prosessorille TMS320C5515
• Valitse kohteen konfiguraatio (target configuration) videon tapaan, ja anna sille nimeksi 5515simu
• Aja läpi simulointi ja tarkista että konsoliin tulostuu "Hello World"
• Valitse sitten Target/New target configuration ja luo uusi kohteen konfiguraatio USBSTK5515 USB
prosessorikortille ja anna sille nimeksi 5515emu. Valitse Connection=Texas Instruments XDS100v2 USB
Emulator, Kirjoita Device kenttään 5515, ja valitse USBSTK5515.
• Linkitä uusi emulointikonfiguraatio projektiin ja valitse se aktiiviseksi
• Suorita projekti
• Avaa View/disassembly
• Suorita projektia assemblerikäsky kerrallaan disassebly ikkunasta
• Arviolta montako konekäskyä (kellojaksoa) ohjelman suoritus kestää 2/10/20/50/100/enemmän?
• FIR filter sample [[13]]
Harjoitukset
• Laskuharjoitus 1 Suodattimen suunnittelu, pyöristys ja skaalaus
• Laskuharjoitus 2 FIR-suodattimien toteutus
•
•
•
•
• FIR suodattimen integrointi audiofilter koodiin DSP:llä
Laskuharjoitus 3 IIR-suodattimen toteutus
Ensimmäinen TMS32C5515 sovellus
Lähtötasokoe
ManInTheMoon
2
AUTO3310
Harjoitustyö
Vaatimukset
• Toimiva toteutus
• Työselostus
• Palautus 15.2.2012
Vinkkejä
•
•
•
•
•
C55xx ChipSupportLibrary
Keskeytysten käyttö
USBSTK5505 insinöörityö [14]
USBSTK5515-käyttöliittymälevy
Nopea FFT ja muita DSP funktioita on valmiina TI:n [DSPLIBraryssä [15]]
Aiheita
•
•
•
•
•
•
Funktiogeneraattori / Mats & Joni / Staffan
Flanger (Kitaraefektilaatikko) / Thomas S.
Jakosuodin / Christian
Delta-Sigma muunnin
Välkyntämittari
PID
References
[1] http:/ / siilo. dyndns. org/ src/ audiofilter. zip
[2] http:/ / sine. ni. com/ nievents/ app/ overview/ p/ eventId/ 42566/ site/ nie/ country/ fi/ lang/ fi/ scope/ country/ location/ fi
[3] http:/ / sine. ni. com/ nievents/ app/ offering/ p/ offeringId/ 456168/ site/ nie/ country/ fi/ lang/ fi
[4] http:/ / www. amazon. com/ Digital-Signal-Processing-Sanjit-Mitra/ dp/ 0073048372
[5] http:/ / www. cs. tut. fi/ ~ts/ part1. pdf
[6] http:/ / www. cs. tut. fi/ ~ts/
[7] http:/ / www. cs. tut. fi/ ~ts/ Allpass_Lecture. pdf
[8] http:/ / processors. wiki. ti. com/ index. php?title=Category:Code_Composer_Studio_v4
[9] http:/ / octave. sourceforge. net/
[10] http:/ / sites. google. com/ site/ guioctave/
[11] http:/ / zone. ni. com/ devzone/ cda/ tut/ p/ id/ 3237
[12] http:/ / software-dl. ti. com/ dsps/ dsps_public_sw/ sdo_ccstudio/ CCSv4/ Demos/ helloworld. htm
[13] http:/ / e2e. ti. com/ support/ dsp/ tms320c5000_power-efficient_dsps/ f/ 110/ p/ 123721/ 449850. aspx
[14] https:/ / publications. theseus. fi/ bitstream/ handle/ 10024/ 24689/ Heikkinen_Mika. pdf
[15] http:/ / processors. wiki. ti. com/ index. php/ DSPLIB
3
4
Lectures
Digitaalisen suodattimen suunnittelu
This page or section is copied from the following Wikipedia page:
Wikipedia, Digital Filter --- Wikipedia, The Free Encyclopedia, 2011, [1] [Online; accessed
15-October-2011]
The page is modified after copying. See revision history to list modifications.
You may use this page according to the free documentation licence!
In electronics, computer science and mathematics, a digital filter is a system that performs mathematical operations
on a sampled, discrete-time signal to reduce or enhance certain aspects of that signal. This is in contrast to the other
major type of electronic filter, the analog filter, which is an electronic circuit operating on continuous-time analog
signals. An analog signal may be processed by a digital filter by first being digitized and represented as a sequence
of numbers, then manipulated mathematically, and then reconstructed as a new analog signal (see digital signal
processing). In an analog filter, the input signal is "directly" manipulated by the circuit.
A digital filter system usually consists of an analog-to-digital converter to sample the input signal, followed by a
microprocessor and some peripheral components such as memory to store data and filter coefficients etc. Finally a
digital-to-analog converter to complete the output stage. Program Instructions (software) running on the
microprocessor implement the digital filter by performing the necessary mathematical operations on the numbers
received from the ADC. In some high performance applications, an FPGA or ASIC is used instead of a general
purpose microprocessor, or a specialized DSP with specific paralleled architecture for expediting operations such as
filtering.
Digital filters may be more expensive than an equivalent analog filter due to their increased complexity, but they
make practical many designs that are impractical or impossible as analog filters. Since digital filters use a sampling
process and discrete-time processing, they experience latency (the difference in time between the input and the
response), which is almost irrelevant in analog filters.
Digital filters are commonplace and an essential element of everyday electronics such as radios, cellphones, and
stereo receivers.
Characterization of digital filters
A digital filter is characterized by its transfer function, or equivalently, its difference equation. Mathematical
analysis of the transfer function can describe how it will respond to any input. As such, designing a filter consists of
developing specifications appropriate to the problem (for example, a second-order low pass filter with a specific
cut-off frequency), and then producing a transfer function which meets the specifications.
The transfer function for a linear, time-invariant, digital filter can be expressed as a transfer function in the
Z-domain; if it is causal, then it has the form:
where the order of the filter is the greater of N or M. See Z-transform's LCCD equation for further discussion of this
transfer function.
From the definitions of Z-transform and Fourier transform, it directly follows that the frequency response of the
filter, having transfer function shown above is:
Digitaalisen suodattimen suunnittelu
This is the form for a recursive filter with both the inputs (Numerator, b-polynomial) and outputs (Denominator,
a-polynomial), which typically leads to an IIR infinite impulse response behaviour, but if the denominator is made
equal to unity i.e. no feedback, then this becomes an FIR or finite impulse response filter.
Analysis techniques
The behaviour of the given filter can be most easily analyzed by computer programs, such as MATLAB, but it is a
great advantage to the filter designer to be able to roughly estimate the behaviour of the filter directly from the
difference equation or transfer function. It is esseintial to understand the relation between difference equation,
transfer function, the roots and poles of the filter, the frequency response and the impulse response.
Impulse response
The impulse response, often denoted
or , is a measurement of how a filter will respond to the Kronecker
delta function. For example, given a difference equation, one would set
and
for
and
evaluate. The impulse response is a characterization of the filter's behaviour. Digital filters are typically considered
in two categories: infinite impulse response (IIR) and finite impulse response (FIR). In the case of linear
time-invariant FIR filters, the impulse response is exactly equal to the sequence of filter coefficients:
IIR filters on the other hand are recursive, with the output depending on both current and previous inputs as well as
previous outputs. The general form of the an IIR filter is thus:
Plotting the impulse response will reveal how a filter will respond to a sudden, momentary disturbance.
Difference equation
In discrete-time systems, the digital filter is often implemented by converting the transfer function to a linear
constant-coefficient difference equation (LCCD) via the Z-transform. The discrete frequency-domain transfer
function is written as the ratio of two polynomials. For example:
This is expanded:
and divided by the highest order of :
The coefficients of the denominator, , are the 'feed-backward' coefficients and the coefficients of the numerator
are the 'feed-forward' coefficients, . The resultant linear difference equation is:
or, for the example above:
5
Digitaalisen suodattimen suunnittelu
6
rearranging terms:
then by taking the inverse z-transform:
and finally, by solving for
:
This equation shows how to compute the next output sample,
, in terms of the past outputs,
, the
present input,
, and the past inputs,
. Applying the filter to an input in this form is equivalent to a
Direct Form I or II realization, depending on the exact order of evaluation.
Roots and poles
The roots of the numerator polynomial (b-polynomial) of the transfer function are called as zeros of the filter,
because in these locations the transfer function is zero. Correspondingly, the roots of the denominator polynomial
(a-polynomial) are the poles of the filter. In poles, the transfer function approaches to infinity. The digital filter is
stable if and only if its poles are inside a unit circle.
Below is an example plot of the roots (O) and poles (X) of the Butterworth filter in a Z-plane, as well as a plot of the
impulse response and frequency response of the same filter.
Below is the Octave code used from designing a Butterworh filter and to plot the zeros and poles plot, and impulseand frequency responses.
Design a tenth order low-pass butterworth filter, which cut-off frequency is
frequency.
[b,a]=butter(10, 0.2)
Plot zeroes and poles in the Z-plane
, where
is the Nyquist
Digitaalisen suodattimen suunnittelu
zplane(b,a)
set (findobj (gcf, '-property', 'markersize'), 'markersize', 12)
print('zplane.png', '-dpng'
Plot the frecuency response
freqz(b,a)
print('freqz.png', '-dpng')
Plot the impulse response
h=impz(b,a)
plot(h(1:70))
set (findobj (gcf, '-property', 'linewidth'), 'linewidth', 2)
grid()
print('impz.png', '-dpng')
Filter design
The design of digital filters is a deceptively complex topic.[2] Although filters are easily understood and calculated,
the practical challenges of their design and implementation are significant and are the subject of much advanced
research.
There are two categories of digital filter: the recursive filter and the nonrecursive filter. These are often referred to as
infinite impulse response (IIR) filters and finite impulse response (FIR) filters, respectively.[3]
Filter realization
After a filter is designed, it must be realized by developing a signal flow diagram that describes the filter in terms of
operations on sample sequences.
A given transfer function may be realized in many ways. Consider how a simple expression such as
could be evaluated – one could also compute the equivalent
. In the same way, all realizations may
be seen as "factorizations" of the same transfer function, but different realizations will have different numerical
properties. Specifically, some realizations are more efficient in terms of the number of operations or storage
elements required for their implementation, and others provide advantages such as improved numerical stability and
reduced round-off error. Some structures are better for fixed-point arithmetic and others may be better for
floating-point arithmetic.
7
Digitaalisen suodattimen suunnittelu
Direct Form I
A straightforward approach for IIR filter realization is Direct Form I, where the difference equation is evaluated
directly. This form is practical for small filters, but may be inefficient and impractical (numerically unstable) for
complex designs.[4] In general, this form requires 2N delay elements (for both input and output signals) for a filter of
order N.
Direct Form II
The alternative Direct Form II only needs N delay units, where N is the order of the filter – potentially half as much
as Direct Form I. This structure is obtained by reversing the order of the numerator and denominator sections of
Direct Form I, since they are in fact two linear systems, and the commutativity property applies. Then, one will
notice that there are two columns of delays (
) that tap off the center net, and these can be combined since they
are redundant, yielding the implementation as shown below.
The disadvantage is that Direct Form II increases the possibility of arithmetic overflow for filters of high Q or
resonance.[5] It has been shown that as Q increases, the round-off noise of both direct form topologies increases
without bounds.[6] This is because, conceptually, the signal is first passed through an all-pole filter (which normally
boosts gain at the resonant frequencies) before the result of that is saturated, then passed through an all-zero filter
(which often attenuates much of what the all-pole half amplifies).
Cascaded second-order sections
A common strategy is to realize a higher-order (greater than 2) digital filter as a cascaded series of second-order
"biquadratric" (or "biquad") sections[7] (see digital biquad filter). The advantage of this strategy is the fact that the
coefficient range is limited. Cascading direct form II sections results in N delay elements for filters of order N.
Cascading direct form I sections results in N+2 delay elements since the delay elements of the input of any section
(except the first section) are redundant with the delay elements of the output of the preceding section.
8
Digitaalisen suodattimen suunnittelu
Other Forms
Other forms include:
•
•
•
•
•
•
•
•
•
Direct Form I and II transpose
Series/cascade[8]
Parallel[8]
Ladder form[8]
Lattice form[8]
Coupled normal form
Multifeedback
Analog-inspired forms such as Sallen-key and state variable filters
Systolic arrays
Comparison of analog and digital filters
Digital filters are not subject to the component non-linearities that greatly complicate the design of analog filters.
Analog filters consist of imperfect electronic components, whose values are specified to a limit tolerance (e.g.
resistor values often have a tolerance of +/- 5%) and which may also change with temperature and drift with time. As
the order of an analog filter increases, and thus its component count, the effect of variable component errors is
greatly magnified. In digital filters, the coefficient values are stored in computer memory, making them far more
stable and predictable.[9]
Because the coefficients of digital filters are definite, they can be used to achieve much more complex and selective
designs – specifically with digital filters, one can achieve a lower passband ripple, faster transition, and higher
stopband attenuation than is practical with analog filters. Even if the design could be achieved using analog filters,
the engineering cost of designing an equivalent digital filter would likely be much lower. Furthermore, one can
readily modify the coefficients of a digital filter to make an adaptive filter or a user-controllable parametric filter.
While these techniques are possible in an analog filter, they are again considerably more difficult.
Digital filters can be used in the design of finite impulse response filters. Analog filters do not have the same
capability, because finite impulse response filters require delay elements.
Digital filters rely less on analog circuitry, potentially allowing for a better signal-to-noise ratio. A digital filter will
introduce noise to a signal during analog low pass filtering, analog to digital conversion, digital to analog conversion
and may introduce digital noise due to quantization. With analog filters, every component is a source of thermal
noise (such as Johnson noise), so as the filter complexity grows, so does the noise.
However, digital filters do introduce a higher fundamental latency to the system. In an analog filter, latency is often
negligible; strictly speaking it is the time for an electrical signal to propagate through the filter circuit. In digital
filters, latency is a function of the number of delay elements in the system.
Digital filters also tend to be more limited in bandwidth than analog filters. High bandwidth digital filters require
expensive ADC/DACs and fast computer hardware for processing.
In very simple cases, it is more cost effective to use an analog filter. Introducing a digital filter requires considerable
overhead circuitry, as previously discussed, including two low pass analog filters.
9
Digitaalisen suodattimen suunnittelu
Types of digital filters
Many digital filters are based on the Fast Fourier transform, a mathematical algorithm that quickly extracts the
frequency spectrum of a signal, allowing the spectrum to be manipulated (such as to create band-pass filters) before
converting the modified spectrum back into a time-series signal.
Another form of a digital filter is that of a state-space model. A well used state-space filter is the Kalman filter
published by Rudolf Kalman in 1960.
References
General
• A. Antoniou, Digital Filters: Analysis, Design, and Applications, New York, NY: McGraw-Hill, 1993.
• J. O. Smith III, Introduction to Digital Filters with Audio Applications [10], Center for Computer Research in
Music and Acoustics (CCRMA), Stanford University, September 2007 Edition.
• S.K. Mitra, Digital Signal Processing: A Computer-Based Approach, New York, NY: McGraw-Hill, 1998.
• A.V. Oppenheim and R.W. Schafer, Discrete-Time Signal Processing, Upper Saddle River, NJ: Prentice-Hall,
1999.
• J.F. Kaiser, Nonrecursive Digital Filter Design Using the Io-sinh Window Function, Proc. 1974 IEEE Int. Symp.
Circuit Theory, pp. 20–23, 1974.
• S.W.A. Bergen and A. Antoniou, Design of Nonrecursive Digital Filters Using the Ultraspherical Window
Function, EURASIP Journal on Applied Signal Processing, vol. 2005, no. 12, pp. 1910–1922, 2005.
• T.W. Parks and J.H. McClellan, Chebyshev Approximation for Nonrecursive Digital Filters with Linear Phase
[11]
, IEEE Trans. Circuit Theory, vol. CT-19, pp. 189–194, Mar. 1972.
• L. R. Rabiner, J.H. McClellan, and T.W. Parks, FIR Digital Filter Design Techniques Using Weighted Chebyshev
Approximation [12], Proc. IEEE, vol. 63, pp. 595–610, Apr. 1975.
• A.G. Deczky, Synthesis of Recursive Digital Filters Using the Minimum p-Error Criterion [13], IEEE Trans.
Audio Electroacoust., vol. AU-20, pp. 257–263, Oct. 1972.
Cited
[1]
[2]
[3]
[4]
[5]
[6]
http:/ / en. wikipedia. org/ w/ index. php?title=Digital_filter& oldid=439099415,
M. E. Valdez, Digital Filters (http:/ / home. mchsi. com/ ~mikevald/ Digfilt. html), 2001.
A. Antoniou, chapter 1
J. O. Smith III, Direct Form I (http:/ / ccrma-www. stanford. edu/ ~jos/ filters/ Direct_Form_I. html)
J. O. Smith III, Direct Form II (http:/ / ccrma-www. stanford. edu/ ~jos/ filters/ Direct_Form_II. html)
L. B. Jackson, "On the Interaction of Roundoff Noise and Dynamic Range in Digital Filters," Bell Sys. Tech. J., vol. 49 (1970 Feb.), reprinted
in Digital Signal Process, L. R. Rabiner and C. M. Rader, Eds. (IEEE Press, New York, 1972).
[7] J. O. Smith III, Series Second Order Sections (http:/ / ccrma-www. stanford. edu/ ~jos/ filters/ Series_Second_Order_Sections. html)
[8] A. Antoniou
[9] http:/ / www. dspguide. com/ ch21/ 1. htm
[10] http:/ / ccrma-www. stanford. edu/ ~jos/ filters/ filters. html
[11] http:/ / ieeexplore. ieee. org/ search/ wrapper. jsp?arnumber=1083419
[12] http:/ / ieeexplore. ieee. org/ search/ wrapper. jsp?arnumber=1451724
[13] http:/ / ieeexplore. ieee. org/ search/ wrapper. jsp?arnumber=1162392
10
Digitaalisen suodattimen suunnittelu
External links
• WinFilter (http://www.winfilter.20m.com/) – Free filter design software
• Filtplot (http://www.pyspuc.com/index.cgi/demo) – Free customizable digital filter design software built with
python and boost (WinXP/Ubuntu 6.10/RHEL-4). Also with interactive web interface.
• DISPRO (http://www.digitalfilterdesign.com/) – Free filter design software
• Java demonstration of digital filters (http://www.falstad.com/dfilter/)
• IIR Explorer educational software (http://www.terdina.net/iir/iir_explorer.html)
• Introduction to Filtering (http://math.fullerton.edu/mathews/c2003/ZTransformFilterMod.html)
• Introduction to Digital Filters (http://ccrma.stanford.edu/~jos/filters/filters.html)
• Publicly available, very comprehensive lecture notes on Digital Linear Filtering (see bottom of the page) (http://
www.cs.tut.fi/~ts/)
Suodatintyyppejä
IIR
• [Butterworth [1]]
• [Chebyshev I ja II [2]]
• [Elliptic [3]]
FIR
1.
2.
3.
4.
Symmetrinen parillinen
Symmetrinen pariton
Antisymmetrinen parillinen
Antisymmetrinen pariton
Taajuusvasteen mukaan
•
•
•
•
Alipäästö
Ylipäästö
Kaistanpäästö
Kaistanesto
References
[1] http:/ / en. wikipedia. org/ wiki/ Butterworth_filter
[2] http:/ / en. wikipedia. org/ wiki/ Chebyshev_filter
[3] http:/ / en. wikipedia. org/ wiki/ Elliptic_filter
11
Suodattimen suunnittelu
Suodattimen suunnittelu
Filter specifications
Symbols
•
•
•
•
Pass band ripple (e.g. 3 dB)
Stop band attenuation (e.g. 60 dB)
Pass band edge (e.g. 0.2 )
Stop band edge frequency (e.g. 0.5 )
Filter design
To design a filter means to select the coefficients such that the system has specific characteristics. The required
characteristics are stated in filter specifications. Most of the time filter specifications refer to the frequency response
of the filter. There are different methods to find the coefficients from frequency specifications:
1. Window design method (Ikkunamenetelmä)
2. Frequency Sampling method (Taajuustason näytteistys)
3. Weighted least squares design (Pienimmän neliösumman menetelmä)
4. Parks-McClellan method (also known as the Equiripple, Optimal, or Minimax method). The Remez exchange
algorithm is commonly used to find an optimal equiripple set of coefficients. Here the user specifies a desired
frequency response, a weighting function for errors from this response, and a filter order N. The algorithm then
finds the set of
coefficients that minimize the maximum deviation from the ideal. Intuitively, this finds
the filter that is as close as you can get to the desired response given that you can use only
coefficients.
This method is particularly easy in practice since at least one text[1] includes a program that takes the desired filter
and N, and returns the optimum coefficients.
12
Suodattimen suunnittelu
5. Equiripple FIR filters can be designed using the FFT algorithms as well[2]. The algorithm is iterative in nature.
You simply compute the DFT of an initial filter design that you have using the FFT algorithm (if you don't have
an initial estimate you can start with h[n]=delta[n]). In the Fourier domain or FFT domain you correct the
frequency response according to your desired specs and compute the inverse FFT. In time-domain you retain only
N of the coefficients (force the other coefficients to zero). Compute the FFT once again. Correct the frequency
response according to specs.
Software packages like MATLAB, GNU Octave, Scilab, and SciPy provide convenient ways to apply these different
methods.
Some filter specifications refer to the time-domain shape of the input signal the filter is expected to "recognize". The
optimum matched filter for separating any waveform from white noise is obtained by sampling that shape and using
those samples in reverse order as the coefficients of the filter -- giving the filter an impulse response that is the
time-reverse of the expected input signal.
Window design method
In the Window Design Method, one designs an ideal IIR filter, then applies a window function to it – in the time
domain, multiplying the infinite impulse by the window function. This results in the frequency response of the IIR
being convolved with the frequency response of the window function[3] – thus the imperfections of the FIR filter
(compared to the ideal IIR filter) can be understood in terms of the frequency response of the window function.
The ideal frequency response of a window is a Dirac delta function, as that results in the frequency response of the
FIR filter being identical to that of the IIR filter, but this is not attainable for finite windows, and deviations from this
yield differences between the FIR response and the IIR response.
References
[1] Rabiner, Lawrence R., and Gold, Bernard, 1975: Theory and Application of Digital Signal Processing (Englewood Cliffs, New Jersey:
Prentice-Hall, Inc.) ISBN 0139141014
[2] A. E. Cetin, O.N. Gerek, Y. Yardimci, "Equiripple FIR filter design by the FFT algorithm," IEEE Signal Processing Magazine, pp. 60-64,
March 1997.
[3] FIR Filter Design: The Window Design Method (http:/ / www. vocw. edu. vn/ content/ m11285/ latest/ ), by Nguyen Huu Phuong (http:/ /
www. vocw. edu. vn/ member_profile/ PhuongNguyen)
13
Kiinteän pilkun luvut
14
Kiinteän pilkun luvut
Numeroiden esitysmuotoja
Eli miten esittää desimaalilukuja käyttämättä liukulukuja,
http://en.wikipedia.org/wiki/Q_%28number_format%29
Positiivinen kokonaisluku
X3 X2 X1 X0
Offset binary
X3 X2 X1 X0
Kiinteän pilkun luvut
15
Suuruus ja arvo (sign and magnitude)
s X2 X1 X0
Yhden komplementti
s X2 X1 X0
Kahden komplementti
s X2 X1 X0
Kiinteän pilkun luvut
16
QN
s f2 f1 f0
Q15:
s f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0
Liukulukuformaatit
IEEE:n määrittämässä 32-bittisessä liukulukuformaatissa on aluksi etumerkkibitti, sitten seuraa kahdeksanbittinen
exponentti, joka on esitetty offset-binary-muodossa. Fraction-osuudelle jää 23 bittiä.
s e7 e6 e5 e4 e3 e2 e1 e0 f22 f21 ... f3 f2 f1 f0
http://en.wikipedia.org/wiki/Single_precision_floating-point_format
Texas Instrumentsin 32-bittisessä liukulukuformaatissa exponentti ja fraction-osa ovat saman mittaisia kuin IEEE:n
formaatissakin, mutta etumerkkibitti on sijoitettu exponentin ja fraction-bittien väliin, ja exponentti on koodattu
myös kahden komplementtimuodossa.
e7 e6 e5 e4 e3 e2 e1 e0 s f23 f22 ... f3 f2 f1 f0
Oikeasti liukuluvut ovat 32 bittisiä
Laskeminen QN luvuilla
This page or section is copied from the following Wikipedia page:
Wikipedia contributors, Q (number format), 2011, [1] [Online; accessed
18-October-2011]
The page is modified after copying. See revision history to list modifications.
You may use this page according to the free documentation licence!
Kiinteän pilkun luvut
Characteristics
Q format numbers are (notionally) fixed point numbers (but not actually a number itself); that is, they are stored and
operated upon as regular binary numbers (i.e. signed integers), thus allowing standard integer hardware/ALU to
perform rational number calculations. The number of integer bits, fractional bits and the underlying word size are to
be chosen by the programmer on an application-specific basis — the programmer's choices of the foregoing will
depend on the range and resolution needed for the numbers. The machine itself remains oblivious to the notional
fixed point representation being employed — it merely performs integer arithmetic the way it knows how. Ensuring
that the computational results are valid in the Q format representation is the responsibility of the programmer.
The Q notation is written as Qm.n, where:
• Q designates that the number is in the Q format notation — the Texas Instruments representation for signed
fixed-point numbers (the "Q" being reminiscent of the standard symbol for the set of rational numbers).
• m is the number of bits set aside to designate the two's complement integer portion of the number, exclusive of the
sign bit (therefore if m is not specified it is taken as zero).
• n is the number of bits used to designate the fractional portion of the number, i.e. the number of bits to the right of
the binary point. (If n = 0, the Q numbers are integers — the degenerate case).
Note that the most significant bit is always designated as the sign bit (the number is stored as a two's complement
number) in order to allow standard arithmetic-logic hardware to manipulate Q numbers. Representing a signed
fixed-point data type in Q format therefore always requires m+n+1 bits to account for the sign bit. Hence the smallest
machine word size required to accommodate a Qm.n number is m+n+1, with the Q number left justified in the
machine word.
For a given Qm.n format, using an m+n+1 bit signed integer container with n fractional bits:
• its range is [-2m, 2m - 2-n]
• its resolution is 2-n
For example, a Q14.1 format number:
• requires 14+1+1 = 16 bits
• its range is [-214, 214 - 2−1] = [-16384.0, +16383.5] = [0x8000, 0x8001 … 0xFFFF, 0x0000, 0x0001 … 0x7FFE,
0x7FFF]
• its resolution is 2−1 = 0.5
Unlike floating point numbers, the resolution of Q numbers will remain constant over the entire range.
Math operations
Q numbers are a ratio of two integers: the numerator is kept in storage, the denominator is equal to 2n.
Consider the following example:
The Q8 denominator equals 28 = 256
1.5 equals 384/256
384 is stored, 256 is inferred because it is a Q8 number.
If the Q number's base is to be maintained (n remains constant) the Q number math operations must keep the
denominator constant.
17
Kiinteän pilkun luvut
Because the denominator is a power of two the multiplication can be implemented as an arithmetic shift to the left
and the division as an arithmetic shift to the right; on many processors shifts are faster than multiplication and
division.
To maintain accuracy the intermediate multiplication and division results must be double precision and care must be
taken in rounding the intermediate result before converting back to the desired Q number.
Using C the operations are (note that here, Q refers to the fractional part's number of bits) :
Addition
signed int a,b,result;
result = a+b;
Subtraction
signed int a,b,result;
result = a-b;
Multiplication
// precomputed value:
#define K
(1 << (Q-1))
signed int
a, b, result;
signed long int temp;
temp = (long int) a * (long int) b; // result type is operand's type
// Rounding; mid values are rounded up
temp += K;
// Correct by dividing by base
result= temp >> Q;
Division
signed int a,b,result;
signed long int temp;
// pre-multiply by the base (Upscale to Q16 so that the result will be in Q8 format)
temp = (long int)a << Q;
// So the result will be rounded ; mid values are rounded up.
temp = temp+b/2;
result = temp/b;
18
Kiinteän pilkun luvut
Conversion tool
When esitimating finite word length effects (resolution smaller than the resolution of float or double data types) a
tool for obtaining an as good approximation of a given number with specified resolution could be useful. Such an
application can be found from the link below.
http://dl.dropbox.com/u/26757722/Conversion%20tool.exe
How the application works:
• The entered number is split up into an integer part and a fractional part.
• A binary representation of the integer part is obtained by the division algorithm.
• The minimum deviation between the fractional part of the entered number and the number possible to get with the
specified resolution is calculated.
• The integer number corresponding to the minimum is converted into binary form by the division algorithm.
• The two parts are combined into one binary number.
• An integer represenation and a real represenation of the number is calculated and displayed based on the binary
represenation.
• Finally is a the deviation between the entered number and the obtained number calculated and displayed.
Notes:
• The (possible) sign bit is seen as an integer bit.
• Negative signed numbers are calculated as the absolute value of the number and are then made negative by
performing a 2'complement conversion (see above).
• The application is not "foolproof".
• .NET Framework 4.0 is needed.
Additional info
Wikipediasta voi huvikseen lukea lisätieto http://en.wikipedia.org/wiki/Fixed-point_arithmetic
[Tapio Saramäellä [6]] on tästäkin loistava [kalvosarja [2]].
Scaling
Eli miten estetään ylivuotojen muodostuminen digitaalisessa järjestelmässä.
Digitaalista signaalia suodatettaessa lukualue ei saa ylittää käytössä olevaa lukualuetta, mutta lukujen pitää kuitenkin
käyttää koko lukualue hyväkseen, jotta laskennan dynamiikka olisi riittävän laaja. Tämän vuoksi suodatettava
sekvenssi voidaan skaalata sopivalle alueelle. Yleensä käytetään yhtä kolmesta skaalausvaihtoehdosta.
Skaalauskertoimena käytetään yleensä sisääntulon ja impulssivasteen p-normeja.
19
Kiinteän pilkun luvut
20
Turvallinen skaalaus
Turvallinen skaalaus on suurin ulostulo joka voi esiintyä millä tahansa sisäänmenolla. Turvallista skaalausta
käytettäessä ylivuotoa ei esiinny, mutta järjestelmän dynamiikka ei tule kovin hyvin hyödynnetyksi.
L2 Normi
• L2 normi on yleensä käyttökelpoisin.
• L2 on impulssivasteen RMS keskiarvo.
• Teoriassa L2 on ideaalinen silloin kun sisääntulo muistuttaa valkoista kohinaa.
normi
L-ääretön normi
•
on impulssivasteen suurin arvo
• Ylivuotoa ei tapahdu millään sinimuotoisella signaalilla
normi
Esimerkki
h=fir1(10,0.2)
h =
1.0538e-04
1.0769e-02
5.4319e-02
1.3901e-01
2.2926e-01
2.6849e-01
2.2926e-01
1.3901e-01
5.4319e-02
1.0769e-02
1.0538e-04
norm(h,1)
ans = 1.1354
norm(h,2)
ans = 0.47115
norm(h,inf)
ans = 0.26849
Kiinteän pilkun luvut
sum(abs(h))
ans = 1.1354
sqrt(sum((h).^2))
ans = 0.47115
max(abs(h))
ans = 0.26849
Äärellisen sananpituuden vaikutukset
Pyöristysvirheet
Lukujen pyöristäminen kiinteän pilkun esitysmuotoon aiheuttaa laskentaan vaihtelevansuuruisia virheitä ja ilmiöitä.
Näitä vaikutuksia kutsutaan kiinteän sananpituuden vaikutuksiksi (finite wordlength effects). Kiinteän sananpituuden
vaikutuksia ovat:
• AD--Kvantisointikohina
•
•
•
•
Kertoimien pyöristysvirheet
Pyöristyskohina
Aritmeettinen ylivuoto
Rajavärähtely
AD-kvantisointikohina
•
•
•
•
•
aiheutuu siitä että analoginen signaali pitää pyöristää kokonaisluvuksi AD--muunnoksen yhteydessä.
Kohinaa voidaan monissa tlainteissa mallintaa valkoisella kohinalla.
Vaikutus ei ole yleensä fataalia, mutta häiritsevää.
Kvantisointikohinaa voi vähentää lisäämällä käytettävää sananpituutta.
Tärkeää on myös hyödyntää sananpituus maksimaalisesti.
21
Kiinteän pilkun luvut
Kertoimien pyöristysvirheet
[b,a]=ellip(9,3,60,0.2)
H=freqz(b,a);plot(20*log10(abs(H)))
N=11:H=freqz(fix(b*2^N),fix(a*2^N));plot(20*log10(abs(H)))
axis([0,600,-100,20])
•
•
•
•
Johtuu suodattimen kertoimien pyöristämisestä käytettävissä olevaan tarkkuuteen.
Kertoimien pyöristäminen liikuttaa suodattimen nollia ja napoja Z-tasossa.
Tiukka suodatin voi mennä käyttökelvottomaksi, kun kertoimia joudutaan pyöristämään.
Sopivilla optimointialgoritmeilla voidaan valita kertoimet, jotka eivät pahasti häiriinny pyöristyksestä.
Suodattimen herkkyys
IIR-suodatin on herkempi kertoimien pyöristyksen aiheuttamille virheille kuin FIR. IIR on erityisen herkkä, jos sillä
on korkea asteluku tai sen jotkut navat ovat lähellä toisiaan. IIR voi myös muuttua epästabiiliksi, jos navat siirtyvät
yksikköympyrän ulkopuolelle.
Ratkaisu: Hajotetaan IIR-suodatin 2-navan paloihin (biquad)
• Jaetaan navat kompleksikonjugaattipareihin, ja lasketaan kutakin paria vastaavat kertoimet
• Jaetaan nollat kompleksikonjugaattipareihin, ja lasketaan kutakin paria vastaavat kertoimet
• Muodostetaan suodatinlohkot valitsemalla aina yhdet osoittajakertoimet ja yhdet nimittäjäkertoimet
• Koodataan toisen asteen suodatinlohko, ja käytetään sitä N/2 kertaa peräkkäin käyttäen joka kerta eri kertoimia
ja .
22
Kiinteän pilkun luvut
Pyöristyskohina
• Pyöristyskohinan syynä on se, että yhteen- ja kertolaskuissa tuloksessa on enemmän bittejä kuin operandeissa.
Osa biteistä joudutaan typistämään pois ennen kuin tulosta voidaan käyttää.
• Laskutoimituksen tulosta varten on yleensä käytettävissä reilusti prosessorin sananpituutta leveämpi akku, joten
välituloksia ei tarvitse pyöristää, vain lopputulos ennen muistiin tallentamista.
Aritmeettinen ylivuoto
• Tapahtuu, kun luku on niin iso, ettei se enää mahdu käytettävissä olevalle lukualueelle.
• 2:n komplementtiluvuissa suurimman positiivisen luvun jälkeen tulee pienin negatiivinen luku ja pienimmän
negatiivisen luvun jälkeen tulee suurin positiivinen luku: Ylivuodon seuraukset vakavia.
• Ylivuodon haittoja voidaan vähentää saturoivalla aritmetiikalla.
Katso DSP Mnemonic instruction set reference guide:sta SAT src käskyn selitys ja sivulta 332 seuraavien status
registerien (PMST, ST0, ST1) bittien merkitykset: OVM, OVA, OVB, SMUL, SST.
Rajavärähtely
• Rajavärähtely (limit cycle oscillation) on ilmiö, jossa järjestelmän ulostulo jää värähtelemään, vaikka sisäänmeno
menee nollaksi. Rajavärähtely syntyy pyöristysvirheen takaisinkytkennän takia.
• Laske vasemmalla olevan piirin ulostulo, kun se on aluksi 1, a=-0.9, ja tarkkuus on 1 desimaali. Pyöristyksenä
typistys.
• Pyöristyskohinan kohdalla ajateltiin, että kohina, e[n], on signaalista riippumatonta valkoista kohinaa. Se ei pidä
paikkansa, jos signaali käsittää vain pienen osan signaalin koko dynamiikka-alueesta.
FIR-suodattimien kiinteän pilkun vaikutus on helppo arvioida, mutta IIR-suodattimien osalta suorituskyvyn
analysointi on paljon hankalampaa IIR:än takaisinkytkentäominaisuuden takia.
23
Kiinteän pilkun luvut
References
[1] http:/ / en. wikipedia. org/ w/ index. php?title=Q_(number_format)& oldid=433985823,
[2] http:/ / www. cs. tut. fi/ ~ts/ part5. pdf
Signaaliprosessorit
Vaatimuksia DSP prosessoriarkkitehtuurille
Tyypillisiä operaatioita
• IIR, konvoluutio:
• FFT
• Korrelaatio (Konvoluutio eri etumerkillä)
Vaatimuksia laitteistolle
•
•
•
•
•
•
Muistia tarvitaan runsaasti kertoimien ja signaalin arvojen tallentamiseen
Kertolaskujen (ja yhteenlaskujen MAC) on oltava nopeita
Tiedon siirtämisen oltava nopeaa, sekä prosessorin sisällä että ulos/ulkoa
Qn notaatiota käytettäessä shiftausten on oltava nopeita
Luuppien suorittaminen tehokkaasti.
Tehokkaita osoitusmuotoja tiedon hakemiseen tehokkaasti (erityisesti FFT, bit reversed addressing)
Ratkaisuja
•
•
•
•
•
•
•
•
•
Laitteistokertolaskuyksikkö
Erillinen osoitteenmuodostusyksikkö, joka tukee erityisosoitusmuotoja (bit reversed addressing, yms)
(Super) Harvard-arkkitehtruuri, jossa jopa useita erillisiä dataväyliä tiedonsiirron nopeuttamiseksi.
Kommunikaatioportteja moniprosessoriratkaisujen toteuttamiseksi
Rengaspuskuri (circular buffer)
Zero overhead loops (yleiskustannukseton looppi)
Liukuhihnoitus (Pipelining)
Superskalaarisuus (super scalar)
RISC-tyyppinen rekisterien käyttöön perustuva käskykoodisto
24
Signaaliprosessorit
Vaihtoehtoja signaaliprosessorille
•
•
•
•
FPGA (Field Programmable Gate Array)
ASIC (Application Specific Intergrated Circuit)
Yleiskäyttöinen tietokone
Mikrokontrolleri
Prosessorin rakenne
Yksinkertainen prosessori sisältää seuraavat toimintoyksiköt:
•
•
•
•
•
•
Dekoodaus- ja ohjausyksikön (Decode & control)
Aritmeettis-loogisen yksikön (ALU)
Datapolun säätöön tarvittavia komponentteja (MUX, jne)
Rekistereitä
Osoitteenkoodausyksikkö
Oheislaitteet
Oheislaitteet
25
Signaaliprosessorit
• DMA (Direct Memory Access) suoritin, siirtää dataa muistiosoitteesta toiseen pääsuoritinta kuormittamatta.
DMA-siirto voidaan aktivoida esimerkiksi siirtämään ulkoisesta EPROM-datamuistista suodattimen kertoimet
valmiiksi nopeampaan sisäiseen datamuistiin ennen kuin suodatinta tarvitaan.
• Odotustilojen muodostusyksiköllä voidaan luoda automaattisesti odotustiloja hitaampaan ulkoiseen muistiin
viitattaessa.
• Emokoneen rajapintayksikkö (Host port interface) huolehtii kommunikoinnista mahdollisen emokoneen kanssa.
Esimerkiksi Texasin USBSTK5515 kommunikoi PC:llä käytettävän Code Composer Studion kanssa juuri tämän
yksikön avulla.
• Vahtikoira (Watchdog), yksikkö, jonka voi konfiguroida resetoimaan prosessori, jos prosessori lakkaa
päivittämästä tiettyä lippua määrävälein (on jumiutunut).
• Ajastimen (timer) avulla voidaan ajastaa alirutiini suoriutumaan täsmällisesti tiettynä aikana tai säännöllisesti
tietyin aikavälein.
• USART (Universal Synchronous Asynchronous Receiver Transmitter) on konfiguroitava sarjamuotoisen
tiedonsiirron vastaanotto ja lähetinyksikkö. Sen voi konfiguroida hoitamaan sekä synkronisen että asynkronisen
sarjaliikenteen kehysten (frame) luominen ja purkaminen.
• JTAG (Joint Testing Actions Group) on IEEE:n standardoima (IEEE 1149) arkkitehtuuri laitteiston testauksen
helpottamiseksi. Sen avulla prosessorin porttien ja rekisterien tilaa voidaan tarkastella kytkemättä siihen mitään
muita mittalaitteita kuin JTAG-isäntä.
• PLL (Phase Locked Loop) lukittuu sisään syötettyyn signaalin ja luo ulostulosignaalin, joka on riippuvainen
sisääntulosignaalin taajuudesta ja vaiheesta. PLL:llä voidaan suorittaa esimerkiksi taajuudeen jakaminen tai
kertominen.
• Keskeytysohjain (Interrup controller) hoitaa keskeytysten maskauksen, keskeytyslippujen asettamisen ja
keskeytysten kuittaamisen. Laitteistokeskeytykset otetaan käyttöön aktivoimalla bitti keskeytysmaskirekisteristä
(Interrupt Mask Register, IMR). Keskeytyksen tullessa aktivoituu bitti keskeytyslippurekisterissä (Interrupt Flag
Register, IFR)
26
Signaaliprosessorit
• GPIO (General Purpose I/O) -ohjaimen avulla prosessorin yleiskäyttöiset I/O-portit voidaan konfiguroida
haluttuun tilaan ja niihin voidaan kirjoittaa ja niitä lukea tietyn muistiosoitteen kautta.
Data path
1. Prosessori lukee ohjelmamuistista käskysanan mittaisen käskykoodin.
2. Dekoodaus ja ohjausyksikkö tulkitsee käskyn merkityksen ja ohjaa prosessorin datapolun multiplekserit oikeaan
asentoon ja käskee ALU:n suorittaa oikean laskuoperaation. Siten prosessori suorittaa halutun toimenpiteen.
3. Ohjelmalaskuri (PC) pitää muistissa seuraavan käskykoodin osoitteen
4. Rekistereihin tallennetaan yleensä operandit ja välitulokset (joskus suoraan muistiin/muistista)
Liukuhihna
Liukuhihnalla tarkoitetaan sitä, että yksittäisen käskyn suoritus jaetaan vaiheisiin, jotka suoritetaan rinnakkain
seuraavien ja edeltävien käskyjen eri vaiheiden kanssa. Rinnakkaisen suorittamisen tekee mahdolliseksi se, että
vaiheet on määritelty niin, että niissä käytetään laitteiston eri osia. Esimerkki RISC-prosessorin käskyn klassisesta
vaiheistuksesta:
1.
2.
3.
4.
Instruction fetch (käskyn hakeminen)
Instruction decode and register fetch (käskyn tulkinta ja rekisterin luku)
Execute (käskyn suorittaminen)
Memory access (luku muistista rekisteriin tai kirjoittaminen rekisteristä muistiin)
5. Register write back (tuloksen tallentaminen rekisteriin)
Kun ohjelmakoodin N:ttä käskyä on suoritetaan, niin liukuhihnan etenee seuraavasti:
27
Signaaliprosessorit
28
Fetch Decode Execute Mem access Write
N
N+1
N
N+2
N+1
N
N+3
N+2
N+1
N
N+4
N+3
N+2
N+1
N
Jos N:s käsky on ehdollinen hyppykäsky, tiedetään vasta "Execute" vaiheessa toteutetaanko hyppy vai ei. Jos hyppy
suoritetaan, niin liukuhihnalle on jo ladattu käskyjä, joita ei suoritetakkaan, koska suoritus hyppäsikin toiseen
paikkaan. Tällöin liukuhihna pitää tyhjentää:
Fetch Decode Execute Mem access Write
N
N+1
N
N+2
N+1
M
M+1
N
N
M
N
Liukuhihnalle tullut aukko vähentää prosessorin tehokkuutta. Ongelma voidaan korjata käyttämällä viivästettyä
hyppykäskyä (Delayed branch), joka aiheuttaa hypyn vasta kaksi kellojaksoa execute-vaiheen jälkeen. Tällöin
hyppykäskyä seuraavat kaksi komentoa suoritetaan aina, eikä liukuhinan tyhjentämistä koskaan tarvita.
Assembler ja C kieli
C vai assembler
• Itse asiassa DSP-järjestelmän toteutus alkaa usein vielä paljon korkeammalta tasolta kuin C, nimittäin kaavioista
ja algoritmeista matemaattisessa tai lohkokaaviomuodossa. (MATLAB, SimuLink, LabView)
• Algoritmeja simuloidaan ja testataan mielellään jo ennen c- tai assembler toteutusta
• Prosessorille optimoitua c:tä voi joillain työkaluilla generoida automaattisesti lohkokaavioesityksestä.
• c käännetään assembleriksi ja edelleen objektitiedostoksi, joista suoritettava ohjelma linkitetään. (Makefile,
Eclipse project)
• Suoritettava ohjelma yleensä Common Object File Format (COFF) muodossa
DSP-prosessorit ovat niin mutkikkaita ja DSP-sovelluksiin optimoituja, ettei niiden tehokkuutta (rekisterien käytön
optimointi, rinnakkaisuus, zero-overhead loops, jne.) pysty kokonaan hyödyntämään C-ohjelmasta käsin.
DSP-sovellusten ydinosat ovat myös monesti tiukkoja erityislaatuisia luuppeja. Toisaalta taas, kontrollikoodin
(if-then, switch-case, jne) määrä kasvaa DSP-järjestelmienkin monimutkaistuessa. Sen voi varsin tehokkaasti
toteuttaa c:lläkin.
Assembler ja C kieli
C-kieli
Ajonaikainen C-ympäristö
Ajonaikainen C-ympäristö (C run time environment) koostuu joukosta käytäntöjä, määrittelyjä ja kirjastoja.
Esimerkiksi:
• Sopimus muistin käytöstä, mukaanlukien pino ja rekisterit
• funktioiden kutsukäytännöt
• järjestelmän alustamiskäytännöt
Texasin linkkeri linkittää ohjelman mukaan rts.lib -kirjaston. Sen boot-rutiini, c_int00 alustaa c-ympäristön.
RESET-keskeytysvektoriin laitetaan hyppykäsky c_int00-alirutiiniin (tarkista vectors.asm).
c_int00 rutiini suorittaa seuraavat toimenpiteet:
• Konfiguroi pinomuistin
• Alustaa globaalit muuttujat .bss-lohkossa hakemalla niiden oletusarvot .cinit-lohkosta (autoinitialisation)
• Kutsuu ohjelman _main-rutiinia
ANSI/ISO C -standardin mukaan kääntäjä alustaa vain ne globaalit ja staattiset muttujat, jotka on explisiittisisesti
alustettu alkuarvoon. Muut muuttujat on ohjelmoijan itse asetettava haluttuun arvoon, eikä luottaa siihen, että niiden
alkuarvo olisi automaattisesti 0.
Mitä seuraava ohjelma tulostaa:
#include <stdio.h>
int x,y;
float pi=3.141;
int z=0;
int main(void) {
int i=0;
int j;
x=5;
int k=(i+j+x+y+z)*pi;
}
Muuttujat pi, z, ja i on alustettu explisiittisesti. Muuttujat x,y ja j voivat olla alustamatta. Vain x:ään tallennetaan
myöhemmin luku. Muuttujien y ja j arvot voivat olla mitä sattuu. Siksi ei ole tietoa, mikä k:n arvo tulee olemaan.
Joissakin ympäristöissä kääntäjä voi alustaa myös alustamattomat muuttujat, mutta siitä ei ole mitään takeita.
Muistikappaleet (memory sections)
Kääntäjä jakaa objektitiedoston kappaleisiin. Jokaisessa kappaleessa on eri tarkoitukseen käytettävää tietoa.
Käännösvaiheessa eri muistikappaleille valitaan muistialue kohdeprosessorin fyysisestä muistiosoitteesta. Eri
muistikappaleet voidaan tallettaa eri muistilaitteille tarpeen mukaan. Esimerkiksi ohjelmakoodia sisältävä .text-lohko
tallennetaan aina ohjelmamuistiin. Vakioita ja alkuarvoja sisältävät .cinit- ja .const-kappaleet pitää tallentaa
haihtumattomaan muistiin. Muuttujia sisältävät .bss, .stack ja .sysmem määritellään yleensä sijaitsemaan
RAM-muistissa.
Alustetut muistikappaleet
• .cinit: Taulukoita muttujien ja vakioiden alustamiseksi
29
Assembler ja C kieli
• .const: Vakioita
• .switch: switch-case -hyppytaulukoita
• .text: Suoritettava koodi, aina ohjelmamuistissa
Alustamattomia muistikappaleita
• .bss: Muistialue globaaleille ja staattisille muuttujille, c_int00 alustaa nämä boottivaiheessa .cinit kappaleen
sisällön perusteella
• .far: Sama kuin .bss, mutta muuttujille, jotka on määritelty
määreellä (far)
• .stack: Pinomuisti
• .sysmem: Dynaamisesti varattava muistialue eli keko (heap)
Assembler-kieli
• Prosesoria ohjataan kirjoittamalla muistikkaita (mnemonic)
• Parametreilla lähde- ja kohderekisterit tai muistipaikat
• Parametri voi olla myös käskykoodissa vakiona
• Assembler-kielellä ohjelmoidessa ohjataan suoraan prosessorin toimintaa: Mitä ALU tekee, mistä haetaan
parametrit, mihin tulos laitetaan.
• DSP-prosessorin käskyt vastaavat melko suoraan tyypillisiä signaalinkäsittelyoperaatioita: 1 MAC = 1
FIR-suodattimen tappi
• DSP-algoritmien toteuttaminen DSP-assemblerilla voi olla melkein yhtä nopeaa kuin millä tahansa
ohjelmointikielellä ohjelmoiminen.
• Prosessoriarkkitehtuuri on kuitenkin tunnettava perinpohjin.
• Koska assemblerilla käskytetään suoraan prosessoria, ei sama koodi toimi kuin yhdessä prosessorissa
Assemblerin kutsuminen C-kielisestä ohjelmasta
C-kielinen pääohjelma
extern void fir(int taps,int results,int *y);
main()
{
// set wait states to zero using in-line assembly
asm(" STM
#0,SWWSR");
// call assembly FIR routine
fir(TAPS,RESULTS,y);
}
Assembly kielinen aliohjelma
;
;
;
;
;
;
;
stack looks like this upon entry to this asm routine:
RET_ADDR <-- SP
RESULTS
&y
AL = TAPS
30
Assembler ja C kieli
; allocate label definition here
.mmregs
.def _fir
.ref _a,_x
.text
_fir: STLM
A,BK
;load BK with TAPS (16)
MVDK
*SP(1),*(BRC) ;load BRC with RESULTS (185)
MVDK
*SP(2),*(AR1) ;load ARn with &y
LD
#0,DP
;set SST bit (saturate on store)
ORM
#1,@PMST
SSBX
FRCT
;set FRCT bit (fractional mode)
RSBX
OVM
;clr OVM bit (overflow mode)
SSBX
SXM
;set SXM bit (sign extension)
STM #1,AR0
STM #_a,AR2
;setup ARs for MAC
STM #_x,AR3
RPTB done-1
MPY *AR2+0%,*AR3+,A ;1st product
RPT #14
;mult/acc 15 terms
MAC *AR2+0%,*AR3+,A
MAR *+AR3(-15)
STH A,*AR1+
;store result
done: RSBX FRCT
RET
;return
Optimointia
• Koodin voi aluksi silti koodata kokonaankin C:llä, sitten profiloimalla etsiä pullonkaulat ja koodata tiukimmat
luupit assemblerillä.
• Paras tapa on erottaa pullonkaula omaksi alirutiinikseen ja koodata se kokonaan assemblerilla. Ei missään
tapauksessa puukottamalla vain suoraan kääntäjän generoimaa assembler-koodia. Silloin ei voi enää muokata
C-koodia ja kääntää sitä uudestaan assembleriksi.
• C-ympäristön kunnossapysymisestä huolehdittava assemblerilla koodattaessa.
• Valmiit tehokkaasti assemblerilla toteutetut, C:stä kutsuttavissa olevat aliohjelmakirjastot ovat suositeltavia
standardiongelmiin. Maailmaan ei tarvita enää enempää harrastelijoiden tekemiä FFT-toteutuksia
tuotantokäyttöön :) (Vrt. ExpressDSP)
31
IIR-suodattimen osittaminen
IIR-suodattimen osittaminen
Miksi IIR pitäisi hajottaa osiin?
Korkean asteluvun IIR suodattimesta tulee helposti epästabiili, kun se toteutetaan äärellisen sananpituuden
laskentatarkkuudella (fixed point). Suodattimen herkkyyttä pyöristysvirheille voidaan vähentää jakamalla suodatin
sarjaan kytkettyihin toiseen asteen lohkoihin.
Suunnitellaan Chebychev suodatin
dp=3
Rp=1-10**(-dp/20)
Rp = 0.29205
[b,a]=cheby1(n=8, Rp, [0.25,0.40])
Koska suodatin on kaistanpäästösuodatin, sen asteluku N=2*8=16, ja sillä on 17 kerrointa.
> size(b)
ans =
1
17
> size(a)
ans =
1
17
Suoraviivainen toteutusyritys
Lasketaan suodattimen skaalauskertoimet
> norm(a,2)
ans = 1818.0
> norm(b,2)
ans = 2.4261e-05
Skaalataan kertoimet ja munnetaan ne Q15 luvuiksi
> [fix(a'/norm(a,2)*2^15), fix(b'/norm(b,2)*2^15)]
ans =
18
-144
636
-1926
4424
-8091
12126
-15131
15859
288
0
-2310
0
8087
0
-16175
0
20218
32
IIR-suodattimen osittaminen
-13997
10377
-6405
3239
-1304
398
-83
9
0
-16175
0
8087
0
-2310
0
288
Tällä tavalla skaalaamalla kertoimet säilyttäisivät hyvin tarkkuutensa, mutta suodattimelle tulisi noin 160 dB
vahvistusta:
> 20*log10(sa)+20*log10(1/sb)
ans = 157.49
Oikea skaalaus koko suodattimelle saadaan skaalaamalla impulssivasteen mukaan
> h=impz(b,a);
> s=norm(h,2)
s = 0.38799
Skaalaus voitaisiin toteuttaa kertomalla esimerkiksi b-kertoimet s:llä, mutta tällöin ne pienenisivät entisestään, ja ne
ovat jo nyt liian pieniä esitettäväksi Q15 lukuina.
Siksi näin ison suodattimen toteuttaminen yhtenä pötkönä on hyvin epäkäytännöllistä. Signaalin tasojen ja
suodattimen kertoimien skaalaamiset ovat keskenään ristiriitaisia tavoitteita.
Toteuttaminen osittamalla toisen asteen lohkoiksi
Osoittajapolynomin, b, osittaminen
Aloitetaan osoittajapolynomista b. Sen juuret (eli suodattimen nollat) löytyvät käskyllä roots
> rb=roots(b)
ans =
1.00910
1.00642
1.00642
0.99999
0.99999
0.99358
0.99358
0.99093
-1.00926
-1.00653
-1.00653
-0.99998
-0.99998
-0.99347
-0.99347
-0.99079
+
+
+
+
+
+
+
+
+
+
0.00000i
0.00643i
0.00643i
0.00909i
0.00909i
0.00641i
0.00641i
0.00000i
0.00000i
0.00655i
0.00655i
0.00924i
0.00924i
0.00651i
0.00651i
0.00000i
33
IIR-suodattimen osittaminen
34
Koska
polynomin
b,
kertoimet
ovat
reaaliset,
ovat
nollakohdat
joko
kaksoisjuuria
kompleksilukukonjugaattipareja. Ryhmitellään nollat kompleksilukukonjugaateiksi tai kaksoisjuuripareiksi:
1.00910 + 0.00000i
1
lohko1
1.00642 + 0.00643i
1.00642 - 0.00643i
2
3
lohko2
lohko2
0.99999 + 0.00909i
0.99999 - 0.00909i
4
5
lohko3
lohko3
0.99358 + 0.00641i
0.99358 - 0.00641i
6
7
lohko4
lohko4
0.99093 + 0.00000i
8
lohko1
-1.00926 + 0.00000i
9
lohko5
-1.00653 + 0.00655i 10
-1.00653 - 0.00655i 11
lohko6
lohko6
-0.99998 + 0.00924i 12
-0.99998 - 0.00924i 13
lohko7
lohko7
-0.99347 + 0.00651i 14
-0.99347 - 0.00651i 15
lohko8
lohko8
-0.99079 + 0.00000i 16
lohko5
tai
Lasketaan lohkoille kertoimet käyttämällä funktiota poly. Poly(r) laskee sellaisen polynomin, jonka juuret ovat r, ja
jonka korkeimman asteen kerroin on 1. Jos polylle annetaan parametriksi kaksi juurta, se antaa sellaisen toisen
asteen polynomin kertoimet, jonka nollakohdat ovat annettujen juurien kohdalla, ja jonka toisen asteen tekijän
kerroin on 1.
> b1=poly([rb(1), rb(8)])
b1 =
1.00000
-2.00002
0.99994
Vastaavasti muut toisen asteen polynomit:
b1=poly([rb(1), rb(8)]);
b2=poly(rb(2:3));
b3=poly(rb(4:5));
b4=poly(rb(6:7));
b5=poly([rb(9), rb(16)]);
b6=poly(rb(10:11));
b7=poly(rb(12:13));
b8=poly(rb(14:15));
IIR-suodattimen osittaminen
35
Tarkista lopuksi että kaikki kertoimet bi ovat reaalilukuja.
Nimittäjäpolynomin, a, osittaminen
Tehdään sama ositus nimittäjäpolynomille, a (suodattimen navat):
> ra=roots(a)
ans =
0.30183 + 0.93969i
0.30183 - 0.93969i
1
2
0.33125 + 0.90469i
0.33125 - 0.90469i
3
4
0.39013 + 0.86233i
0.39013 - 0.86233i
5
6
0.70206 + 0.69847i
0.70206 - 0.69847i
7
8
0.66798 + 0.70554i
0.66798 - 0.70554i
9
10
0.61465 + 0.73070i
0.61465 - 0.73070i
11
12
0.54493 + 0.76944i
0.54493 - 0.76944i
13
14
0.46608 + 0.81554i
0.46608 - 0.81554i
15
16
Lasketaan osalohkojen kertoimet
a1=poly(ra(1:2))
a2=poly(ra(3:4))
a3=poly(ra(5:6))
a4=poly(ra(7:8))
a5=poly(ra(9:10))
a6=poly(ra(11:12))
a7=poly(ra(13:14))
a8=poly(ra(15:16))
Tarkista että kaikki kertoimet ovat reaalilukuja!
IIR-suodattimen osittaminen
36
Toisen asteen suodatinlohkojen koostaminen
A- ja b-polynomien juuriparit sisältävät polynomit voidaan ryhmitellä mielivaltaisesti toisen asteen
suodatinlohkoiksi (Biquad). Valitaan vaikka suoraviivaisimmilla tavalla, ja lasketaan skaalauskertoimet joka
lohkolle erikseen:
s1=norm(impz(b1,a1));
s2=norm(impz(b2,a2));
s3=norm(impz(b3,a3));
s4=norm(impz(b4,a4));
s5=norm(impz(b5,a5));
s6=norm(impz(b6,a6));
s7=norm(impz(b7,a7));
s8=norm(impz(b8,a8));
> [s1, s2, s3, s4, s5, s6, s7, s8]
ans =
6.5286
7.3381
3.9175
3.0816
4.3179
14.1148
10.5633
8.4947
Kertoimien muuntaminen Q15 muotoon
Kertoimet skaalataan ja muunnetaan Q15 muotoon.
round([b1/s1*2^15; a1*2^15])
ans =
5019 -10038
5019
32768 -19781
31920
round([b1/s1*2^15;
round([b2/s2*2^15;
round([b3/s3*2^15;
round([b4/s4*2^15;
round([b5/s5*2^15;
round([b6/s6*2^15;
round([b7/s7*2^15;
round([b8/s8*2^15;
a1*2^15])
a2*2^15])
a3*2^15])
a4*2^15])
a5*2^15])
a6*2^15])
a7*2^15])
a8*2^15])
Lopputuloksen tarkistaminen
Sarjaan kytkettyjen suodattimien taajuusvaste saadaan yksinkertaisesti kertomalla yksittäisten suodattimien
taajuusvasteet toisillaan. Lasketaan kokonaisjärjestelmän taajuusvaste ja tulostetaan se:
H1=freqz(b1/s1,a1);
H2=freqz(b2/s2,a2);
H3=freqz(b3/s3,a3);
H4=freqz(b4/s4,a4);
H5=freqz(b5/s5,a5);
H6=freqz(b6/s6,a6);
H7=freqz(b7/s7,a7);
IIR-suodattimen osittaminen
37
H8=freqz(b8/s8,a8);
Htot=H1.*H2.*H3.*H4.*H5.*H6.*H7.*H8;
Horig=freqz(b,a);
f=linspace(0,1,512);
plot(f,20*log10(abs(Horig)), f, 20*log10(abs(Htot)))
axis([0,1,-200,10])
grid()
Tulostetaan myös pyöristetyillä ja skaalatuilla kertoimilla:
Hf1=freqz(round(b1/s1*2^15),round(a1*2^15));
Hf2=freqz(round(b2/s2*2^15),round(a2*2^15));
Hf3=freqz(round(b3/s3*2^15),round(a3*2^15));
Hf4=freqz(round(b4/s4*2^15),round(a4*2^15));
Hf5=freqz(round(b5/s5*2^15),round(a5*2^15));
Hf6=freqz(round(b6/s6*2^15),round(a6*2^15));
Hf7=freqz(round(b7/s7*2^15),round(a7*2^15));
Hf8=freqz(round(b8/s8*2^15),round(a8*2^15));
Hftot=Hf1.*Hf2.*Hf3.*Hf4.*Hf5.*Hf6.*Hf7.*Hf8;
Horig=freqz(b,a);
f=linspace(0,1,512);
plot(f,20*log10(abs(Horig)), f, 20*log10(abs(Htot)), f,
20*log10(abs(Hftot)), '-+')
axis([0,1,-200,10])
grid()
xlabel('Frequency')
ylabel('Attenuation [dB]')
Tulos
näyttää
täyttävän
varsin
hyvin
annetut
vaatimukset
Monitaajuussignaalinkäsittely
Monitaajuussignaalinkäsittely
Näytteistysteoreema
[[1]]
Desimointi
Kun signaali desimoidaan, sen näytteistystaajuus ja siten myös Newquist-taajuus, Fn, pienenee. Kaikki uuden
Newquist taajuuden Fn' yläpuolella olevat taajuudet laskostuvat välille [0, Fn'], seuraavan kuvan mukaisesti.
Kuvassa vihreällä merkityt signaalit laskostuvat magentalla piirrettyjen taajuuksien päälle. Desimoinnin jälkeen
vihreällä merkittyjä taajuuskaistoja ei enää ole, mutta sen sijaan signaalissa on niiden peilikuvat, sinisellä merkityt
taajuuskaistat. Laskostuminen on joskus hyödyllistä, mutta yleensä se halutaan välttää. Tyypillisesti laskostuminen
estetään siten, että signaali alipäästösuodatetaan ennen desimointia, seuraavan lohkokaavion mukaisesti.
Keltaisella käyrällä kuvattu alipäästösuodatin suodattaa pois vihreällä merkityt korkeat taajuudet, jolloin vain
magentanvärinen alue jää jäljelle. Laskostumista ei tapahdu. Tällä tavalla magentan värinen taajuuskaista säilyy
muuttumattomana desimoinnista huolimatta. Näin desimointi yleensä halutaan tehdä.
38
Monitaajuussignaalinkäsittely
Interpolointi
Signaali interpoloidaan lisäämällä joka näytteen väliin (M-1) kappaletta nollia. Tällöin näytteistystaajuus ja
Newquist taajuus kasvavat M-kertaiseksi Fs'=M*Fs, Fn'=M*Fn. Interpolointi aiheuttaa signaaliin peruskaistan
peilikuvia. Nämä peilikuvat saadaan pois suodattamalla interpoloitu signaali alipäästösuodattimella.
Interpolointijärjestelmä on silloin alla näkyvän lohkokaavion mukainen.
Interpoloinnin jälkeen signaali suodatetaan alipäästösuodattimella, jonka rajataajuus on vanha newquist taajuus,
Fn=Fn'/M. Seuraavassa kuvassa näkyy interpoloinnissa muodostuneet peilitaajuudet (vihreä) ja niiden pois
suodattamiseksi suunniteltu alipäästösuodatin (keltainen).
Suodatuksen jälkeen alkuperäinen signaali säilyy käytännössä muuttumattomana interpoloinnista huolimatta.
39
Monitaajuussignaalinkäsittely
Ylinäytteistys
Oversampling
Delta modulation
[[2]]
Delta-Sigma modulation
[[3]]
References
[1] http:/ / en. wikipedia. org/ wiki/ Nyquist%E2%80%93Shannon_sampling_theorem
[2] http:/ / en. wikipedia. org/ wiki/ Delta_modulation
[3] http:/ / en. wikipedia. org/ wiki/ Delta-sigma_modulation
Kertauskysymyksiä
Digitaalisen_suodattimen_suunnittelu
1.
2.
3.
4.
5.
6.
Mitä ovat impulssivaste ja taajuusvaste?
Esitä FIR/IIR suodatin dfferenssiyhtälönä!
Piirrä lohkokaavio järjestelmästä, joka toteuttaa FIR/IIR suodattimen!
Minkälaista digitaalista järjestelmää seuraava differenssiyhtälö kuvaa: y[n]=0.25 x[n] + 0.5 x[n-1] + 0.25 x[n-2]
Entä tämä: y[n]=0.5 y[n-1] + 0.5 y[n-2]
Kirjoita differenssiyhtälöt jotka kuvaavat seuraavia digitaalisia suodattimia
Assembler_ja_C_kieli
1. Mitä tarkoitetaan ajonaikaisella C-ympäristöllä (C-run time environment)?
2. Tarkastele luentomateriaalissa olevia C- ja assemblykielisiä esimerkkejä. Miten ohjelmoijan tarvitsemat tiedot
kielen syntaksista ja prosessoriarkkitehtuurista eroavat näillä ohjelmointikielillä?
3. Mikä on Run Time Support library (RTS)?
4. Miten C-ohjelman main() funktio käynnistyy?
5. Mitä ovat ja mihin tarvitaan muistikappaleita (sections)?
6. Miten fyysinen muistiavaruus ja muistikappaleet ja kääntäjä liittyvät toisiinsa?
7. Hahmottele C-kielinen for-silmukka, joka laskee N:n ensimmäisen kokonaisluvun summan?
8. Hahmottele C-kielellä funktio, joka laskee vektorien x ja h pistetulon.
Kiinteän_pilkun_luvut
1. Miten mikroprosessori tyypillisesti koodaa negatiiviset kokonaisluvut biteiksi?
40
Kertauskysymyksiä
2.
3.
4.
5.
6.
7.
8.
9.
41
Entä miten prosessori voi koodata desimaalilukuja biteiksi?
Mikä on Q15 notaatio?
Mikä on ylivuoto aritmetiikassa? Miten sitä voi välttää tai vaikutusta lieventää?
Mitä apuvälineitä DSP prosessori tarjoaa ylivuotojen ja pyöristyskohinan haittojen vähentämiseen?
Mitä tarkoitetaan saturoivalla aritmetiikalla?
Mitä eroa on liukuvan pilkun (floating point) ja kiinteän pilkun (fixed point) luvuilla?
Esitä seuraavat luvut binäärimuodossa käyttäen 4-bittistä 2:n komplementtimuotoa: 0, 1, 2, 3, 4, 7, 8, -1, -2, -7, -8
Tietokoneella lukuja voidaan yleensä käsitellä vain äärellisellä tarkkuudella. Mitä haittaa tästä voi olla
digitaalisen suodattimen toteutukselle?
10. Mitä ovat L1 , L2 ja
skaalausnormit ja mitä niillä tehdään?
Signaaliprosessorit
1.
2.
3.
4.
5.
6.
Mitä FIR-suodattimen tehokas toteuttaminen vaatii DSP prosessorilta.
Mitä tarkoitetaan liukuhihnalla prosessoriarkkitehtuurista puhuttaessa?
Miksi ehdollinen hyppy vaatii liukuhihnan tyhjentämisen?
Miten hyppykäskyjä voidaan tehostaa liukuhihnoitetussa arkkitehtuurissa?
Mihin tarvitaan ajastinyksikköä?
Mikä on USART?
7. Mikä on JTAG
8. Mikä on PLL
9. Mihin tarvitaan viivästettyjä hyppykäskyjä (delayed branch)?
10. Mikä on kovosilmukka eli zero overhead loop?
11. Mitä muita laitteistoratkaisuja signaaliprosessori on signaalinkäsittelyalgoritmien nopeaan suoritukseen?
42
Excercises
Digital filter design with Octave/MATLAB
Design FIR Filter
>> help remez
`remez' is a function from the file D:\Octave\3.2.4_gcc-4.4.0\libexec\octave\packages\signal-1.0.10\i686-pc-mingw32-api-v37\remez.oct
b = remez(n, f, a [, w] [, ftype] [, griddensity])
Parks-McClellan optimal FIR filter design.
n gives the number of taps in the returned filter
f gives frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]
a gives amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]
w gives weighting applied to each band
ftype is 'bandpass', 'hilbert' or 'differentiator'
griddensity determines how accurately the filter will be
constructed. The minimum value is 16, but higher numbers are
slower to compute.
Frequency is in the range (0, 1), with 1 being the nyquist frequency
Additional help for built-in functions and operators is
available in the on-line version of the manual.
Use the command
`doc <topic>' to search the manual index.
Help and information about Octave is also available on the WWW
at http:/ / www. octave. org and via the help@octave.org
mailing list.
Design a FIR
b=remez(n=84, f=[0, 0.2, 0.25, 0.4, 0.45, 1], a=[0, 0, 1, 1, 0, 0], type='bandpass');
Examine frequency response
freqz(b)
Clear previous figure and see zeros and poles
clf()
zplane(b)
See impulse response
impz(b)
Digital filter design with Octave/MATLAB
43
Design IIR filter
>> help cheby1
`cheby1' is a function from the file D:\Octave\3.2.4_gcc-4.4.0\share\octave\packages\signal-1.0.10\cheby1.m
Generate an Chebyshev type I filter with Rp dB of pass band ripple.
[b, a] = cheby1(n, Rp, Wc)
low pass filter with cutoff pi*Wc radians
[b, a] = cheby1(n, Rp, Wc, 'high')
high pass filter with cutoff pi*Wc radians
[b, a] = cheby1(n, Rp, [Wl, Wh])
band pass filter with edges pi*Wl and pi*Wh radians
[b, a] = cheby1(n, Rp, [Wl, Wh], 'stop')
band reject filter with edges pi*Wl and pi*Wh radians
[z, p, g] = cheby1(...)
return filter as zero-pole-gain rather than coefficients of the
numerator and denominator polynomials.
[...] = cheby1(...,'s')
return a Laplace space filter, W can be larger than 1.
[a,b,c,d] = cheby1(...)
return
state-space matrices
References:
Parks & Burrus (1987). Digital Filter Design. New York:
John Wiley & Sons, Inc.
Additional help for built-in functions and operators is
available in the on-line version of the manual.
Use the command
`doc <topic>' to search the manual index.
Help and information about Octave is also available on the WWW
at http:/ / www. octave. org and via the help@octave.org
mailing list.
dp=3
Rp=1-10**(-dp/20)
Rp = 0.29205
[b,a]=cheby1(n=8, Rp, [0.25,0.40])
Analyse the filter
Digital filter design with Octave/MATLAB
freqz(b,a)
impz(b,a)
zplane(b,a)
CCSV sanastoa
• RTSC: Real Time Software Components, Eclipsen tapa standardoida reaaliaikakomponenttien liittäminen [[1]]
• SYS/BIOS: System, Basic Input Ouptput System, Texas intrumentsin yksinkertainen käyttöjärjestelmä/kirjasto
laitteistorajapinnan abstrahoimiseksi, keskeytysten käsittelyyn ja säikeiden skedulointiin.
• XDAIS: eXpressDsp AlgorIthm Standard Texas Instrumentsin standardiohjelmarajapinta. Texasin tarjoamat DSP
ohjelmistomodulit toteuttavat XDAIS rajapinnan, ja myös omatekoiset modulit voidaan tehdä sen mukaiseksi,
jolloin niitä on helpompi tarjota kolmansille osapuolille. [[2]]
• RTDX: Real Time Data eXchange. Texasin siirtoprotokolla, jolla siirretään dataa ajonaikaisesti isäntäkoneen
(PC) ja DSP levyn välillä.
References
[1] http:/ / www. eclipse. org/ proposals/ rtsc/
[2] http:/ / www. ti. com/ lit/ an/ spra579c/ spra579c. pdf
Laskuharjoitus 1
1. Suunnittele FIR alipäästösuodatin, jonka rajataajuus,
Hz, kun näytteistystaajuua,
Hz.
Päästökaistalla saa olla rippeliä 3 dB (
dB) ja estokaistan vaimennuksen tulisi olla yli 90 db (
dB). Estokaista alkaa viimeistään 8000 Hz kohdalta (
Hz).
2. Suunnittele Chebyshev I tyyppiä oleva kaistanpäästösuodatin, jonka päästökaistan rajataajuudet ovat 1000 Hz ja
2000 Hz, kun , näytteistystaajuus on 8000 Hz. Transitiokaistan leveys on 500 Hz ja päästökaistan rippeli 3 dB.
Estokaistalla suodattimen tulee vaimentaa vähintään 60 dB.
3. Kertoimien pyöristys
1. Pyöristä tehtävien 1 ja 2 suodattimien kertoimet Q15 muotoon.
2. Esitä pyöristetyt kertoimet desimaalimuodossa, kokonaislukuina ja hexalukuina
3. Tarkista suodattimen vaste pyöristyksen jälkeen
4. Skaalaus
1. Laske
2. Laske
,
,
ja
ja
normit tehtävän 1 FIR suodattimelle
normit tehtävän 2 IIR suodattimen a ja b kertoimille erikseen.
44
Laskuharjoitus 2
45
Laskuharjoitus 2
Harkoissa koodattu FIR, testipenkkeineen:
#include <stdio.h>
#include <stdlib.h>
#define Int16 short int
#define Int32 int
Int32 sum(Int16 x[], int n) {
Int32 sum=0;
int i=0;
for(i=0; i<n; i++) {
sum = sum + x[i];
}
return sum;
}
Int16 fir(Int16 x, Int16 b[], Int16 xo[], int n) {
Int32 sum=0;
int i;
// Sift old x
for(i=n-1; ....;...) {
xo[i+1]=xo[i];
}
xo[0]=x;
// MAC loop
for(i=0; i<n ; i++) {
sum = sum + xo[i] * b[i];
}
sum = x*b[0];
sum = sum >> 15;
return (Int16) sum;
// Kerrotaan kaksi Q15 lukua
// Tulos on Q30 luku
// Palautetaan Q15 luvuksi
}
int main(int argc, char *argv[])
{
Int16 x[]={0, 1, 2, 3, 4, 5, 30000, 30000};
Int32 GoldenSumma=15+30000+30000;
Int32 summa=0;
Int16 Y=0;
//
b=fir1(5, 0.3)
Laskuharjoitus 2
46
// br=fix(b*2^15)
Int16 b[]={333, 3856, 12193, 12193, 3856, 333};
Int16 xo[]={0, 0, 0, 0, 0, 0};
Int16 xf[]={32000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// y=fix(filter(b,1,x/2^15)*2^15)
Int16 y[]={325, 3766, 11908, 11908, 3766, 325, 0, 0, 0, 0, 0};
Int16 yo[10]={0};
int i=0;
for(i=0; i<10; i++) {
yo[i] = fir(xf[i], b, xo, 6);
}
// Y=fir(xf[0], b, xo, 6);
int success=1;
for(i=0; i<10; i++) {
if(yo[i] != y[i]) {
printf("Failed! index=%d, %d != %d\n", i, y[i], yo[i]);
success=0;
break;
}
}
if(success) {
printf("Ok\n");
}
system("PAUSE");
return 0;
}
Muita firrejä
[FIR Filter example [1]]
// the FIR filter function
void firFixed( int16_t *coeffs, int16_t *input, int16_t *output,
int length, int filterLength )
{
int32_t acc;
// accumulator for MACs
int16_t *coeffp; // pointer to coefficients
int16_t *inputp; // pointer to input samples
int n;
int k;
// apply the filter to each input sample
for ( n = 0; n < length; n++ ) {
// calculate output n
coeffp = coeffs;
inputp = &input[n];
Laskuharjoitus 2
47
// load rounding constant
acc = 1 << 14;
// perform the multiply-accumulate
for ( k = 0; k < filterLength; k++ ) {
acc += (int32_t)(*coeffp++) * (int32_t)(*inputp--);
}
// saturate the result
if ( acc > 0x3fffffff ) {
acc = 0x3fffffff;
} else if ( acc < -0x40000000 ) {
acc = -0x40000000;
}
// convert from Q30 to Q15
output[n] = (int16_t)(acc >> 15);
}
}
References
[1] http:/ / sestevenson. wordpress. com/ 2010/ 01/ 04/ implementation-of-fir-filtering-in-c-part-3/
FIR suodattimen integrointi audiofilter koodiin
DSP:llä
Lisää MyFir-moduli
Toteutuksessa oli ongelmana viime perjantaina (9.12.2011) se, että audiofilter projektissa oli jo määritelty Int16 ja
Int32 tyypit, mutta ne olivatkin molemmat 16-bittisiä. Siksi suodattimen ulostulo oli koko ajan joko 0, 1 tai -1.
Toimivan toteutuksen ohjeet vaihe-vaiheelta näet alempana.
MyFir Modulin lähdekooditiedosto
Tee aluksi MyFir.c lähdekooditiedosto ja lisää se valmiiseen projektiin.
MyFir.c:
#define Integer32 long int // Int 32 on määritelty väärin usbstk5515
tiedostossa
// Joten ei käytetä sitä vaan korvataan
Integer32 tyypiksi
//#define Int16 short int // Tämä on jo määritelty oikein
usbstk5515.h tiedostossa
// Suodattimen pituus
int filterLength=6;
// Suodattimen kertoimet
Int16 b[6]={333, 3856, 12193, 12193, 3856, 333};
FIR suodattimen integrointi audiofilter koodiin DSP:llä
// Suodattimen tallentamat vanhat sisääntulot
Int16 xo[6]={0};
Int16 fir(Int16 x, Int16 b[], Int16 xo[], int n) {
Integer32 sum=0;
int i;
// Shift old x
for(i=n-1; i>0; i--) {
xo[i]=xo[i-1];
}
xo[0]=x;
// MAC loop
for(i=0; i<n ; i++) {
sum = sum + xo[i] * b[i];
}
sum = x*b[0];
sum = sum >> 15;
return (Int16) sum;
// Kerrotaan kaksi Q15 lukua
// Tulos on Q30 luku
// Palautetaan Q15 luvuksi
}
MyFir modulin header tiedosto
Modulin lähdekoodin lisäksi moduulilla on lisäksi myös yleensä otsaketiedosto (header), mikä esittelee funktiot ja
modulin globaalit muuttujat:
MyFir.h:
extern int filterLength;
extern Int16 b[];
extern Int16 xo[];
Int16 fir(Int16 x, Int16 b[], Int16 xo[], int n);
Muutokset pääohjelmaan
Tämän jälkeen pääohjelmaan tehdään tarvittavat muutokset, jotta oma suodatin saadaan systeemissä valmiiksi olevan
sijalle:
Aluksi main.c: modulin alkuun lisätään #include komento uuden header-tiedoston käyttöönottamiseksi:
#include
#include
#include
#include
#include
#include
"stdio.h"
"usbstk5515.h"
"aic3204.h"
"PLL.h"
"FIR_Filters_asm.h"
"LEDFlasher.h"
48
FIR suodattimen integrointi audiofilter koodiin DSP:llä
#include
#include
#include
#include
#include
#include
Int16
Int16
Int16
Int16
Int16
49
"hamming.h"
"hanning.h"
"kaiser.h"
"rectangular.h"
"stereo.h"
"MyFir.h"
left_input;
right_input;
left_output;
right_output;
mono_input;
#define SAMPLES_PER_SECOND 48000
#define GAIN_IN_dB
30
unsigned long int i = 0;
unsigned int step = 0;
Sitten muutetaan pääluuppia niin, että valmiin suodattimen sijasta, käytetäänkin omaa FIR-suodatinta.
for ( i = 0
{
; i < SAMPLES_PER_SECOND * 600L
;i++
)
aic3204_codec_read(&left_input, &right_input); // Configured for
one interrupt per two channels.
mono_input = stereo_to_mono(left_input, right_input);
//step = LEDFlasher(5); // 5 Different filter settings.
step=0; // Pysytään koko ajan vaihtoehdossa 0
switch (step)
{
case 0: // Uusi kohta
left_output=fir(mono_input, b, xo, filterLength); //
Suodatetaan vasen kanava
right_output=left_output; // Kopioidaan oikeaan kanavaan
break;
case 1:
left_output = mono_input; // Straight through, no processing.
right_output = mono_input;
break;
case 2:
left_output =
FIR_filter_asm(&Hamming_Low_Pass_Filter_500Hz[0], mono_input);
right_output =
FIR suodattimen integrointi audiofilter koodiin DSP:llä
FIR_filter_asm_2(&Hamming_High_Pass_Filter_500Hz[0], mono_input);
break;
case 3:
left_output =
FIR_filter_asm(&Hamming_Low_Pass_Filter_1000Hz[0], mono_input);
right_output =
FIR_filter_asm_2(&Hamming_High_Pass_Filter_1000Hz[0], mono_input);
break;
case 4:
left_output =
FIR_filter_asm(&Hamming_Low_Pass_Filter_2000Hz[0], mono_input);
right_output =
FIR_filter_asm_2(&Hamming_High_Pass_Filter_2000Hz[0], mono_input);
break;
case 5:
left_output =
FIR_filter_asm(&Hamming_Low_Pass_Filter_3000Hz[0], mono_input);
right_output =
FIR_filter_asm_2(&Hamming_High_Pass_Filter_3000Hz[0], mono_input);
break;
}
aic3204_codec_write(left_output, right_output);
}
50
Laskuharjoitus 3
Laskuharjoitus 3
Toteuta laskuharjoituksessa 1, suunnittelemasi Chebychev IIR-suodatin C-kielellä:
1. Jaa N:n asteen suodatin M:ään lohkoon. Parillinen suodatin, jonka asteluku on N, voidaan jakaa M=N/2 toisen
asteen lohkoon. Pariton suodatin taas voidaan jakaa (N-1)/2:een toiseen asteen lohkoon ja yhteen ensimmäisen
asteen lohkoon.
2. Toteuta C-kielellä laskuharjoitus 2:n tapaan, toisen asteen IIR-suodatinlohko C-kielellä
3. Sijoita toiseen asteen suodatinlohkojen kertoimet C-ohjelmaan
4. Tee pääohjelma joka kutsuu toteuttamaasi IIR-suodatinfunktiota
5. Tee testivektori MATLAB/Octavella
6. Testaa pc-koneessa toimiiko suodatin oikein
Huom. ensimmäisen asteen suodatinlohkoa ei tarvitse erikseen toteuttaa. Voit käyttää toisen asteen suodatinlohkon
toteutusta, jossa vain toisen asteen kerroin on nolla.
Ensimmäinen TMS32C5515 sovellus
Code composer studion sisältämä reaaliaikakäyttöjärjestelmä ei vielä tue USBSTK5515:n levyä. Siksi tehdäänkin
audiosuodatin käyttäen BIOS:in sijasta pelkkää laitteiston abstrahoivaa funktiokirjastoa (Chip support library, CSL).
CSL tarjoaa funktiorajapinnan yelisimpien laitteiston käsittelyyn liittyvien tehtävien suorittamiseksi:
•
•
•
•
Kellotaajuuden asettaminen
I2C ja SPI väylän luku/kirjoitus
Ledien, kytkimien ja muun digitaalitulojen ja lähtöjen (General Purpose Input Output, GPIO) luku ja kirjoitus.
Audio codecin luku ja kirjoitus
CSL ei tule CCS:n mukana, vaan pitää ladata erikseen: [C55xx Chip support library (CSL) [1]]
Esimerkkiprojekti
[audiofilter.zip [1]]
Tehtävä
1.
2.
3.
4.
Lisää projektiin uusi moduli fir.c
Toteuta modulissa itse suunnittelemasi FIR suodatin.
Käytä laskennassa Q15 kokonaislukuja
Muuta pääohjelmaa niin, että sisääntuleva data suodatetaankin omalla suodattimellasi
51
Ensimmäinen TMS32C5515 sovellus
Lisäinfoa
• [Speksit AIC3204 AD/DA muuntimelle [2]]
References
[1] http:/ / processors. wiki. ti. com/ index. php/ C5000_Chip_Support_Library#Download
[2] http:/ / www. google. fi/ url?sa=t& rct=j& q=aic3204& source=web& cd=4& ved=0CDsQFjAD& url=http%3A%2F%2Fwww. ti.
com%2Flit%2Fds%2Fslos602a%2Fslos602a. pdf& ei=bCvATsW3FNH74QTCuvypBA&
usg=AFQjCNGHHJDA3OoCL78t469J-jCES7E62Q& cad=rja
52
53
Laboratory
C55xx ChipSupportLibrary
DSP prosessorin (TMS320C5515) oheislaitteita (perihpheral) käytetään helpoiten Texas Instrumentsin Chips
Support Libraryn (CSL) tarjoaman funktiorajapinnan (API=Application Programming Interface) kautta.
CSL-kirjaston dokumentaatio löytyy [CSL manuaalista [1]]. Kyseisen Chip Support Libraryn saa ladattua [Texasin
nettisivulta [2]]. Jos sinulla ei ole admin oikeuksia koneellesi, et voi asentaa edellä mainittua kirjastoa. Siinä
tapauksessa, downloudaa tämä valmiiksi asennettu ja uudelleenzipattu hakemisto jonnekkin sopivaan paikkaan.
Huom! Voit joutua itse kertomaan CodeComposer Studiolle mistä nämä kirjastot löytyvät, koska ne eivät kerran
olekkaan siellä standardipaikassa CSL55xx.zip [3]
CSL-kirjasto otetaan käyttöön kirjaston mukana tulevassa [Release Notes
Lyhyesti sanottuna vaiheet ovat nämä:
[4]
] dokumentissa kuvatulla tavalla.
1. Asenna CSL
2. Tuo Code Composer Studion (CCS) työtilaan (workspace) CSL:n esimerkkiprojekti
c55xx_csl/ccs_v4.0_examples/cslVC5505/ ja käännä se
3. Avaa sitten oma projektisi ja määritä se käyttämään mainittua cslVC5505-projektia (referring project)
Voit myös käyttää jotain noista CSL:n esimerkkiprojekteista oman projektisi pohjana. Silloin kaikki asetukset ovat jo
valmiiksi oikein. Mahdollisesti kiinnostavia CSL:n esimerkkiprojekteja ovat:
•
•
•
•
•
CSL_GPIO: General purpose I/O demo
CSL_GPT: General purpose timer demo
CSL_INTC: Interrupt handling demo
CSL_LCDC_TextDisplayExample
CSL_SAR_* Prosessorin sisäisen A/D muuntimen käyttöesimerkkki (SAR=Successive Approximation Register).
Aikaisemmin audiofilter-esimerkkisovelluksessa käytettiin toista CSL-kirjastoa, joka saattaa olla osittain erillainen.
Siksi on varmaan parempi käyttää tässä tätä uutta kirjastoa.
Mahdollisesti kääntämiseen tarvittavia projektin asetuksia
Project Properties C/C++ Build C5500 Linker File Search path
Include library file or command file as input "-l"
"${ConfigName}/cslVC5505.lib"
"rts55x.lib"
"rts55h.lib"
Add <dir> to library search path (--search path, -i)
"${CG_TOOL_ROOT}/include"
"${RTDX_LIB_DIR}"
"${BIOS_LIB_DIR}"
"${workspace_loc:/cslVC5505}"
"${PROJECT_ROOT}"
"${C5500_CSL_CG_ROOT}/lib"
C55xx ChipSupportLibrary
54
References
[1]
[2]
[3]
[4]
http:/ / focus. ti. com/ lit/ ug/ spru433j/ spru433j. pdf
http:/ / software-dl. ti. com/ dsps/ dsps_public_sw/ dsps_swops_houston/ C55X/ TMS320C55XXCSL-LOWPWR-2. 50. 00. 00-Setup. exe
http:/ / siilo. dyndns. org/ courses/ auto3310/ CSL55xx. zip
http:/ / siilo. dyndns. org/ courses/ auto3310/ C55XCSL_Release_Notes. pdf
Keskeytysten käyttö
Keskeytyksiä kannattaa käyttää C-ohjelmointikielestä käsin TMS320C55xx Chip Support Libraryn (CSL)
tarjoamien funktioiden avulla. Keskeytysten käytöstä CSL-kirjaston avulla on ohjeet [CSL manuaalista [1]]
kappaleesta 12. Ohjeet CSL kirjaston käyttöönotolle löytyvät omalta sivultaan C55xx ChipSupportLibrary.
Koodiesimerkkejä
TMS320C55xx Chip Support Libraryn asetustiedosto
TMS320C55XXCSL-LOWPWR-2.50.00.00-Setup.exe
purkaa CSL tiedostot hakemistoon
c:\Program Files\C55 Low Power Chip Support Library v.2.50\c55xx_csl
Mene tuolla CSL kotihakemistossa olevaan hakemistoon
ccs_v4.0_examples
Siellä on erilaisia esimerkkejä Chip Support kirjaston käytöstä.
Keskeytysten käytöstä käy esimerkiksi
sar/CSL_SAR_IntcExample
Keskeytysten käytölle olleelliset rivit esimerkistä
Liitä mukaan tarvittavat määritykset header-tiedostoista:
#include <csl_intc.h>
#include <csl_general.h>
Esittele oma keskeytyspalvelinfunktio ja keskeytysvektori
/** Interrupt Service Routine */
interrupt void sarISR(void) {
/* Do what is required, but do it fast */
}
/* Reference the start of the interrupt vector table */
/* This symbol is defined in linker command file xxx.cmd, see below
extern void VECSTART(void);
Ota käyttöön oma keskeytyspalvelimesi
//Disable interrupt
IRQ_globalDisable();
*/
Keskeytysten käyttö
55
/* Clear any pending interrupts */
IRQ_clearAll();
/* Disable all the interrupts */
IRQ_disableAll();
/* Initialize Interrupt Vector table */
IRQ_setVecs((Uint32)(&VECSTART));
/* Register the ISR */
IRQ_plug(SAR_EVENT,&sarISR);
/* Enabling Interrupt */
IRQ_enable(SAR_EVENT);
IRQ_globalEnable();
Linkkerin komentotiedosto
-stack
-sysstack
-heap
MEMORY
{
MMR
VEC
DARAM
SARAM
}
0x1000
/* PRIMARY STACK SIZE
0x1000
/* SECONDARY STACK SIZE */
0x3F80
/* HEAP AREA SIZE
*/
(RW)
(RX)
(RW)
(RW)
SECTIONS
{
vectors
.text
.stack
.sysstack
.data
.bss
.cinit
.const
.sysmem
.cio
.buffer1
.buffer2
}
:
:
:
:
:
:
:
:
:
:
origin
origin
origin
origin
>
>
>
>
>
>
VEC
SARAM
SARAM
SARAM
SARAM
SARAM,
:
:
=
=
=
=
0000000h
00000C0h
0000400h
0008000h
ALIGN
ALIGN
ALIGN
ALIGN
=
=
=
=
256
4
4
4
fill = 0
> SARAM
> SARAM
: > DARAM
: > DARAM
: > DARAM
: > DARAM
length
length
length
length
=
=
=
=
0000C0h
000300h
007A00h
01FE80h
*/
/*
/*
/*
/*
MMRs */
on-chip ROM vectors */
on-chip DARAM */
on-chip SARAM */
Keskeytysten käyttö
56
vectors.as
Tässä on vectors.asm CSL kirjastosta:
*****************************************************************************
* Copyright (c) Texas Instruments Inc 2002, 2003, 2004, 2005, 2008
*
*
Use of this software is controlled by the terms and conditions found in the
*
license agreement under which this software has been supplied.
*****************************************************************************
;Module: INTC
;File: vectors.asm - vector table
;**************************************************************************
;;**************************************************************************
.C54CM_off
.CPL_off
.ARMS_off
;**********************************************************************************
;
predefined stack operation modes
;**********************************************************************************
;
USE_RETA
: 2x16-bit fast return mode (RETA used)
;
NO_RETA
: 2x16-bit slow return mode (RETA not used)
;
C54X_STK
: 32-bit fast return mode
;**********************************************************************************
.ref _c_int00
;.ref _sarISR
.def RST
;**********************************************************************************
.sect "vectors"
.align
256
.global _VECSTART
;**********************************************************************************
_VECSTART:
RST:
.ivec
reset_isr, USE_RETA
NMI:
.ivec
nmi_isr
; Reset / Software Interrupt #0
; Nonmaskable Interrupt
INT0:
.ivec
int0_isr
; External User Interrupt #0
INT1:
.ivec
int1_isr
; External User Interrupt #1
TINT:
.ivec
tim_isr
PROG0:
UART:
PROG1:
DMA:
PROG2:
COPROCFFT:
PROG3:
.ivec
.ivec
.ivec
.ivec
.ivec
.ivec
.ivec
i2s0_mmc0_tx_isr
uart_isr
i2s0_mmc0_rx_isr
dma_isr
i2s1_mmc1_tx_isr
coprocfft_isr
i2s1_mmc1_rx_isr
; Timer #0 / Software Interrupt #4
; Programmable 0 Interrupt
; IIS #1 Receive Interrupt
; Programmable 1 Interrupt
; DMA Interrupt
; Programmable 2 Interrupt
; Coprocessor FFT Module Interrupt
; Programmable 3 Interrupt
Keskeytysten käyttö
LCD:
57
.ivec
SARADC:
lcd_isr
.ivec
; LCD Interrupt
saradc_isr
; SAR ADC Interrupt
XMT2:
.ivec
i2s2_tx_isr
; I2S2 Tx Interrupt
RCV2:
.ivec
i2s2_rx_isr
; I2S2 Rx Interrupt
XMT3:
.ivec
i2s3_tx_isr
; I2S3 Tx Interrupt
RCV3:
.ivec
RTC:
i2s3_rx_isr
.ivec
SPI:
.ivec
USB:
; USB Transmit Interrupt
gpio_isr
.ivec
I2C:
; SPI Receive Interrupt
usb_isr
.ivec
EMIF:
; RTC interrupt
spi_isr
.ivec
GPIO:
; I2S3 Rx Interrupt
rtc_isr
; GPIO Interrupt
.ivec
emif_error_isr
i2c_isr
; EMIF Error Interrupt
; IIC interrupt
BERR:
.ivec
berr_isr
; Bus Error Interrupt
DLOG:
.ivec
dlog_isr
; Emulation Interrupt - DLOG
RTOS:
.ivec
rtos_isr
; Emulation Interrupt - RTOS
RTDXRCV:
.ivec
rtdxrcv_isr
; Emulation Interrupt - RTDX receive
RTDXXMT:
.ivec
rtdxxmt_isr
; Emulation Interrupt - RTDX transmit
EMUINT:
.ivec
emuint_isr
; Emulation monitor mode interrupt
SINT30:
.ivec
sint30_isr
; Software Interrupt #30
SINT31:
.ivec
sint31_isr
; Software Interrupt #31
.text
reset_isr:
;
*port(#0x1C01) = #0x0
; Clear idles
bit (ST1, #11) = #1
; Disable interrupts
@IVPD_L = #(RST >> 8) || mmap()
@IVPH_L = #(RST >> 8) || mmap()
bit(ST3,#7) = #0
; Clear bus error interrupts
@#IFR0_L = #0xFFFF
|| mmap()
@#IFR1_L = #0xFFFF
|| mmap()
; clear all pending interrupts
;**********************************************************************************
;
Reset all peripherals
;**********************************************************************************
*port(#0x1C04) = 0x20
nop_16
*port(#0x1C05) = 0x00FF
; Reset all peripherals
nop_16
goto
nmi_isr:
_c_int00
goto
nmi_isr
int0_isr:
goto
int0_isr
int1_isr:
goto
int1_isr
tim_isr:
i2s0_mmc0_tx_isr:
goto
goto
tim_isr
i2s0_mmc0_tx_isr
Keskeytysten käyttö
58
uart_isr:
goto
i2s0_mmc0_rx_isr:
uart_isr
goto
dma_isr:
i2s0_mmc0_rx_isr
goto
i2s1_mmc1_tx_isr:
dma_isr
goto
coprocfft_isr:
i2s1_mmc1_tx_isr
goto
i2s1_mmc1_rx_isr:
coprocfft_isr
goto
lcd_isr:
i2s1_mmc1_rx_isr
goto
saradc_isr:
lcd_isr
goto
saradc_isr
i2s2_tx_isr:
goto
i2s2_tx_isr
i2s2_rx_isr:
goto
i2s2_rx_isr
i2s3_tx_isr:
goto
i2s3_tx_isr
i2s3_rx_isr:
goto
i2s3_rx_isr
rtc_isr:
goto
rtc_isr
spi_isr:
goto
spi_isr
usb_isr:
goto
usb_isr
gpio_isr:
goto
gpio_isr
emif_error_isr:
goto
i2c_isr:
goto
berr_isr:
emif_error_isr
i2c_isr
bit(ST3,#7) = #0
goto
; Clear bus error interrupts
berr_isr
dlog_isr:
goto
dlog_isr
rtos_isr:
goto
rtos_isr
rtdxrcv_isr:
goto
rtdxrcv_isr
rtdxxmt_isr:
goto
rtdxxmt_isr
emuint_isr:
goto
emuint_isr
sint30_isr:
goto
sint30_isr
sint31_isr:
goto
sint31_isr
.text
********************************************************************************
** Name
: no_isr
**
**
** Purpose
**
: Spurious interrupt handler
**
** Author
**
**
:
**
**
**
********************************************************************************
no_isr:
goto no_isr
USBSTK5515-käyttöliittymälevy
USBSTK5515-käyttöliittymälevy
Tarkoitus
Koska USBSTK5515 levyssä on vain pari painonappia, tarkoituksena on toteuttaa yksinkertainen käytöliittymä ja
laajennusosa USBSTK5515 signaaliprosessorikortille. Käyttöliittymäyksikkö kytketään USBSTK5515 kortin
laajennuskortiipaikkaan
kortinreunaliittimellä
(yritetään
soveltaa
tavallisesta
PCI
liittimestä).
Käyttöliittymäyksikköön tulee ainakin potentiometrejä, joiden säätämän jännitetason voi lukea TMS320C5515
prosessorin sisäänrakennetulla 4-kanavaisella 10-bitisellä AD-muuntimella.
Funktiogeneraattori
Tyypillisiä fuktiogeneraattorilla (Function generator [1]) tuotettuja aaltomuotoja ovat
•
•
•
•
•
sahalaita Sawtooth [2]
sakara-aalto tai kanttiaalto Square Wave [3]
kolmioaalto Triangle Wave [4]
Siniaalto Sine Wave / Sinusoid [5]
Kohina Noise [6]. Kohina voi olla taajuuskaistaltaan tasaista, valkoista kohinaa (White Noise [7]) tai
kaistarajoitettua, jolloin puhutaan taajuusjakauman mukaan esimerkiksi vaaleanpunaisesta (Pink Noise [8]),
sinisestä tai ruskeasta (Brown/Brownian noise [9]) kohinasta, etc.
Vaihesiirretyt sinit tarpeellisia tietoliikennetekniikassa ja niitä voidaan käyttää myös monimutkaisempien
aaltomuotojen tuottamisessa. Sakara-aalto on yksinkertaisin tuottaa digitaalisella laitteistolla, ja sitä voidaan käyttää
muiten aaltomuotojen tuottamisessa (vrt. PWM -yksikkö, jonka ulostulo voidaan alipäästösuodattaa analogiseksi
aaltomuodoksi). Musiikkisyntetisaattoreissa generoidaan soittimien ääniä useimmiten aaltomuototaulukoiden avulla
(Wave table [10]) ennen, aikaisemmin käyttäen FM-synteesiä (Frequency Modulation Synthesis [11]).
Puhesyntetisaattorilla tuotetaan ihmisen puhetta muistuttavaa ääntä (Speech synthesis [12]).
59
Funktiogeneraattori
Syntetisointimenetelmiä
Matemaattinen lauseke
Siniaaltoa voidaan tuottaa koodausmielessä helpoiten käyttämällä valmista sin(x) funktiota. Tämä ei kuitenkaan ole
välttämättä kovin tehokasta, jolloin suorittimien suorituskyky voi helposti loppua kesken. Eräässä
signaaliprosessorissa sin(x) operaation laskeminen vaatii 4000 kellojaksoa!
Aaltomuototaulukko
Aaltomuototaulukko vaatii potentiaalisesti paljon muistia. Sen käyttö on kuitenkin tehokasta ja yksinkertaista, ja
taulukkoon voidaan tallentaa (sämplätä) minkämuotoinen aaltomuoto vain. Taajuutta voidaan muuttaa
interpoloimalla ja desimoimalla taulukon aaltomuotoa. Haittapuolena on että kaikki tarvittavat aaltomuodot pitää
tallettaa etukäteen taulukoihin. 90-luvulta lähtien tietokonepelien äänet on pääosin tuotettu aaltomuototaulukoilla.
• Aaltomuototaulukko muodostetaan näytteistämällä analogista aaltomuotoa tai laskemalla aaltomuoto etukäteen.
• Periodisesta signaalista riittää tallettaa yksi jakso, symmetrisistä puoli jaksoa.
• Taajuuttaa voidaan säätää vaihtamalla askelkokoa (laskostumista pitää varoa) on indeksin inkrementointiin
käytety askelkoko, on näytteiden syöttötaajuus ja on signaalin jakson ajalta tallennettujen näytteiden määrä.
• Taulukon indeksi pyöristetään lähimpään arvoon, tai interpoloidaan tallennettujen näytteiden väliin (ensimmäinen
vai korkeampi aste?, taylorin sarja?)
• Vaiheen muuttaminen helppoa, lisäämällä vakio taulukon indeksiin.
FM-synteesi
FM-synteesiä käytettäessä muistintarve on pieni, eikä laskentakapasiteettiakaan tarvita kovin paljoa. FM-synteesillä
ei kuitenkaan voi tuottaa kuin rajallinen määrä aaltomuotoja. Tuotetut aaltomuodot eivät välttämättä kuulosta kovin
"aidoilta" vaan niissä on helposti synteettinen vaikutelma. 80-luvun tietokonepelien äänet olivat pääosin tuotettu
FM-synteesillä.
Marginaalisesti epästabiili IIR
• IIR on marginaalisesti stabiili (marginally stable), jos sen navat tai napa sijaitsee yksikköympyrällä.
• Suunnitellaan IIR, jonka impulssivaste on sinimuotoinen
• Lasketaan siirtofunktio käänteis z-muunnoksella [13]
• Toteutetaan IIR-suodatin annetuilla kertoimilla.
• Tuottaa sinimuotoista signaalia käyttäen vain vähän muistia ja suhteellisen vähän laskentatehoa.
• Tuotetun siniaallon taajuutta ja vaihetta on helppo säätää.
Takaisinkytketty siirtorekisteri, LFSR
Lineaarisesti takaisinkytketty siirtorekisteri (Linear Feedback Shift Register, LFSR [14]) voidaan käyttää
muunmuassa pseudosatunnaislukugeneraattorina eli kohinageneraattorina, Pseudosatunnaisen kohinan tuottamiseen
(Pseudo Random Binary Sequence, PRBS).
• Pseudosatunnainen lukusekvenssi on sellainen deterministinen sekvenssi joka toistaa itseään äärellisen
jaksonpituuden välein, mutta joka muistuttaa tilastollisesti valkoista kohinaa.
• Jos siirtorekisterissä on M tilaa, maksimi sekvenssinpituus on
• Sekvenssi muodostuu takaisinkytkentäluuppien avulla. Vain jotkin takaisinkytkentätavat tuottavat
maksimimittaisen sekvenssin katso N-sequence [15] ja LFSR [16]
60
Funktiogeneraattori
Määritelmiä ja mittauksia
• Aaltomuodon puhtaus ilmoitetaan harmonisen kokonaissärön avulla (Total Harmonic Distortion, THD)
, jossa
on ei haluttujen harmonisten taajuuksien teho ja
on signaalin
kokonaisteho.
• Taajuuden säätö. Tarvitaanko miten toteutetaan, (Voltage Controlled Oscillator, VCO)
• Vaiheen säätö?
• Paljonko muistia voidaan käyttää? Valinta aalon puhtauden ja muistin käytön välillä.
• Suoritusaika. Kompromissi suoritusajan ja muistin käytön suhteen.
• Miten tarkasti vaihe ja taajuus pitää voida säätää?
• Signaalin tilastolliset ominaisuudet
Harjoitustyön vaatimukset
Toteuta USBSTK5515 levyllä signaaligeneraattori, joka tuottaa:
1. Sakara-aaltoa
2. Kolmioaaltoa
3. Siniaaltoa
Aaltomuodon voi valita käyttämällä levyn painonappeja.
Tuotetun aallon seuraavia ominaisuuksia voidaan säätää:
1. Amplitudi
2. Taajuus
Säätö tapahtuu erillisellä USBSTK5515-käyttöliittymälevy llä
References
[1] http:/ / en. wikipedia. org/ wiki/ Function_generator
[2] http:/ / en. wikipedia. org/ wiki/ Sawtooth_wave
[3] http:/ / en. wikipedia. org/ wiki/ Square_wave
[4] http:/ / en. wikipedia. org/ wiki/ Triangle_wave
[5] http:/ / en. wikipedia. org/ wiki/ Sine_wave
[6] http:/ / en. wikipedia. org/ wiki/ Colors_of_noise
[7] http:/ / en. wikipedia. org/ wiki/ White_noise
[8] http:/ / en. wikipedia. org/ wiki/ Pink_noise
[9] http:/ / en. wikipedia. org/ wiki/ Brownian_noise
[10] http:/ / en. wikipedia. org/ wiki/ Wavetable_synthesis
[11] http:/ / en. wikipedia. org/ wiki/ Frequency_modulation_synthesis
[12] http:/ / en. wikipedia. org/ wiki/ Speech_synthesis
[13] http:/ / en. wikipedia. org/ wiki/ Z-transform
[14] http:/ / en. wikipedia. org/ wiki/ LFSR
[15] http:/ / en. wikipedia. org/ wiki/ N-sequence
[16] http:/ / www. ece. cmu. edu/ ~koopman/ lfsr/ index. html
61
Flanger
62
Flanger
Flanger tietoutta ja teknologiaa
•
•
•
•
•
Flanging in Wikipedia [1]
Flanger demo in Youtube [2]
DSP Flanger [3]
FIR Comb Filter [4]
IIR Comb Filter [5]
Flangerin ominaisuuksia
Flanger-efekti tuotetaan summaamalla ääni itseensä viivästettynä aikaviivellä
sinimuotoisesti taajuudella ja amplitudilla siten että kokonaisviive on
• Amplitudia
. Yleensä viivettä säädetään
kutsutaan flangerin pyyhkäisysyvyydeksi (sweep depth)
• Taajuutta kutsutaan vastaaavasti pyyhkäisytaajuudeksi
Sin-funktio on muuten hyvä, mutta se saattaa olla laskennallisesti liian raskasta. Siksi sinifunktio voidaan korvata
myös kolmioaallolla. Siniaalto voidaan myös interpoloida sinitaulukon avulla. Katso Funktiogeneraattori.
Säätö
Flänger efektiä säädetään yleensä seuraavasti:
1. Viiveen suuruus:
2. Pyyhkäisysyvyys:
3. Pyyhkäisytaajuus:
Säätö voidaan toteuttaa käyttämällä USBSTK5515-käyttöliittymälevy ä
References
[1]
[2]
[3]
[4]
[5]
http:/ / en. wikipedia. org/ wiki/ Flanging
http:/ / www. youtube. com/ watch?v=z5P_p7NCjv4
http:/ / online. physics. uiuc. edu/ courses/ . . . / Piya_Poongbunkor_DSP. pdf
http:/ / arrow. dit. ie/ cgi/ viewcontent. cgi?article=1035& context=argcon
http:/ / arrow. dit. ie/ cgi/ viewcontent. cgi?article=1016& context=argcon
Jakosuodin
Jakosuodin
Jakosuodin
Jakosuotimella jaetaan sisääntuleva signaali taajuuskaistoihin. Tyypillinen käyttösovellus on audiojärjestelmän
jakosuodin, jolla sisääntuleva äänisignaali jaetaan basso, diskantti ja mahdollisesti myös keskiäänikanaviin eri
kaiuttimia varten. Koska USBSTK5515 levyssä on vain yksi stereo sisäänmeno ja yksi ulostulo, ei monikanavaista
jakosuodinta pysty yhdellä kortilla toteuttamaan. Mutta sen sijaan toteutetaan jakosuodin, jonka alarajataajuus ja
ylärajataajuus voidaan konfiguroida, niin että se voidaan konfiguroida päästämään läpi joko basso, keskiääni tai
diskanttitaajuudet. Kolmesta samanlaisesta levystä voidaan toteuttaa täysin konfiguroitava jakosuodinjärjestelmä.
Teknisesti yksi tällainen suodatinyksikkö on siis kaistanpäästösuodatin, jonka ala- ja ylärajataajuudet voidaan
konfiguroida. Suodatus tehdään FFT-tasossa, jolloin suodattimen ominaisuuksien muuttaminen on helppoa. FFT
lasketaan käyttäen Texasin valmiita FFT ja IFFT rutiineja.
• Suodatin näytteistää analogiasignaalia näytteistystaajuudella
Hz mikäli suorituskyky siihen riittää.
• FFT lasketaan sopivan mittaisesta bufferista, esim
niin että suodattimien taajuusresoluutio saadaan
riittävän tarkaksi
• Rajataajuudet asetetaan erillisellä USBSTK5515-käyttöliittymälevyllä
63
Article Sources and Contributors
Article Sources and Contributors
AUTO3310 Source: http://siilo.dyndns.org/wiki/index.php?oldid=581 Contributors: Pvs, 17 anonymous edits
Digitaalisen suodattimen suunnittelu Source: http://siilo.dyndns.org/wiki/index.php?oldid=416 Contributors: Pvs, Thomas Hoglund, 4 anonymous edits
Suodatintyyppejä Source: http://siilo.dyndns.org/wiki/index.php?oldid=323 Contributors: Pvs
Suodattimen suunnittelu Source: http://siilo.dyndns.org/wiki/index.php?oldid=332 Contributors: Pvs
Kiinteän pilkun luvut Source: http://siilo.dyndns.org/wiki/index.php?oldid=445 Contributors: Pvs, Tomas S, 7 anonymous edits
Signaaliprosessorit Source: http://siilo.dyndns.org/wiki/index.php?oldid=463 Contributors: Pvs, 5 anonymous edits
Assembler ja C kieli Source: http://siilo.dyndns.org/wiki/index.php?oldid=455 Contributors: Pvs, 5 anonymous edits
IIR-suodattimen osittaminen Source: http://siilo.dyndns.org/wiki/index.php?oldid=582 Contributors: Pvs, 2 anonymous edits
Monitaajuussignaalinkäsittely Source: http://siilo.dyndns.org/wiki/index.php?oldid=497 Contributors: Pvs
Kertauskysymyksiä Source: http://siilo.dyndns.org/wiki/index.php?oldid=460 Contributors: Pvs
Digital filter design with Octave/MATLAB Source: http://siilo.dyndns.org/wiki/index.php?oldid=359 Contributors: Pvs, 3 anonymous edits
CCSV sanastoa Source: http://siilo.dyndns.org/wiki/index.php?oldid=350 Contributors: 2 anonymous edits
Laskuharjoitus 1 Source: http://siilo.dyndns.org/wiki/index.php?oldid=388 Contributors: Thomas Hoglund, 2 anonymous edits
Laskuharjoitus 2 Source: http://siilo.dyndns.org/wiki/index.php?oldid=436 Contributors: Pvs, 1 anonymous edits
FIR suodattimen integrointi audiofilter koodiin DSP:llä Source: http://siilo.dyndns.org/wiki/index.php?oldid=481 Contributors: 7 anonymous edits
Laskuharjoitus 3 Source: http://siilo.dyndns.org/wiki/index.php?oldid=410 Contributors: 1 anonymous edits
Ensimmäinen TMS32C5515 sovellus Source: http://siilo.dyndns.org/wiki/index.php?oldid=362 Contributors: Pvs
C55xx ChipSupportLibrary Source: http://siilo.dyndns.org/wiki/index.php?oldid=578 Contributors: Pvs, 4 anonymous edits
Keskeytysten käyttö Source: http://siilo.dyndns.org/wiki/index.php?oldid=580 Contributors: Pvs, 8 anonymous edits
USBSTK5515-käyttöliittymälevy Source: http://siilo.dyndns.org/wiki/index.php?oldid=542 Contributors: Pvs
Funktiogeneraattori Source: http://siilo.dyndns.org/wiki/index.php?oldid=533 Contributors: Pvs
Flanger Source: http://siilo.dyndns.org/wiki/index.php?oldid=537 Contributors: Pvs
Jakosuodin Source: http://siilo.dyndns.org/wiki/index.php?oldid=538 Contributors: Pvs
64
Image Sources, Licenses and Contributors
Image Sources, Licenses and Contributors
File:Topics.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Topics.png License: unknown Contributors: Pvs
File:Zplane.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Zplane.png License: unknown Contributors: Pvs
File:Impz.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Impz.png License: unknown Contributors: Pvs
File:Freqz.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Freqz.png License: unknown Contributors: Pvs
Image:400px-Biquad direct form1.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:400px-Biquad_direct_form1.png License: unknown Contributors: Pvs
Image:400px-Biquad direct form2.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:400px-Biquad_direct_form2.png License: unknown Contributors: Pvs
File:filter-prototype.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Filter-prototype.png License: unknown Contributors: Pvs
File:numwheel-int.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-int.png License: unknown Contributors: Pvs
File:numwheel-offbin.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-offbin.png License: unknown Contributors: Pvs
File:numwheel-sm.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-sm.png License: unknown Contributors: Pvs
File:numwheel-1c.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-1c.png License: unknown Contributors: Pvs
File:numwheel-2c.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-2c.png License: unknown Contributors: Pvs
File:numwheel-q3.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Numwheel-q3.png License: unknown Contributors: Pvs
File:adnoise.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Adnoise.png License: unknown Contributors: Pvs
File:ellipfir.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Ellipfir.png License: unknown Contributors: Pvs
File:ellipfirfixed.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Ellipfirfixed.png License: unknown Contributors: Pvs
File:firnoise.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Firnoise.png License: unknown Contributors: Pvs
File:limcycle.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Limcycle.png License: unknown Contributors: Pvs
File:dspprosessor.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Dspprosessor.png License: unknown Contributors: Pvs
File:TMS320C5515-peripherals.jpg Source: http://siilo.dyndns.org/wiki/index.php?title=File:TMS320C5515-peripherals.jpg License: unknown Contributors: Pvs
File:pic.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Pic.png License: unknown Contributors: Pvs
File:FixedPointCheby.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:FixedPointCheby.png License: unknown Contributors: Pvs
File:Aliasing_in_decimation.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Aliasing_in_decimation.png License: unknown Contributors: Pvs
File:Decimation.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Decimation.png License: unknown Contributors: Pvs
File:decimation-prevent-alias.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Decimation-prevent-alias.png License: unknown Contributors: Pvs
File:Interpolation.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Interpolation.png License: unknown Contributors: Pvs
File:Images-after-interpolation.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Images-after-interpolation.png License: unknown Contributors: Pvs
File:FIR.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:FIR.png License: unknown Contributors: Pvs
File:IIR.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:IIR.png License: unknown Contributors: Pvs
File:usbstk5515-ui.png Source: http://siilo.dyndns.org/wiki/index.php?title=File:Usbstk5515-ui.png License: unknown Contributors: Pvs
65
License
License
GNU Free Documentation License 1.2
http:/ / www. gnu. org/ licenses/ old-licenses/ fdl-1. 2. txt
66