AUTO 3310 - Digital Signal Processors
Transcription
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 [email protected] 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 [email protected] 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