source: src/temporal/c_weighting.c @ cc74a29

feature/crepe_org
Last change on this file since cc74a29 was 9590e81, checked in by Paul Brossier <piem@piem.org>, 9 years ago

src/temporal/filter.c: check parameters

  • Property mode set to 100644
File size: 10.6 KB
RevLine 
[4f4d892]1/*
[a4364b8]2  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
[4f4d892]3
[a4364b8]4  This file is part of aubio.
[4f4d892]5
[a4364b8]6  aubio is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
[4f4d892]10
[a4364b8]11  aubio is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
[4f4d892]15
[a4364b8]16  You should have received a copy of the GNU General Public License
17  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
[4f4d892]18
[a4364b8]19*/
[4f4d892]20
21#include "aubio_priv.h"
22#include "types.h"
23#include "fvec.h"
[a4364b8]24#include "lvec.h"
[4f4d892]25#include "temporal/filter.h"
[c159aeb]26#include "temporal/c_weighting.h"
[4f4d892]27
[59c046d]28uint_t
29aubio_filter_set_c_weighting (aubio_filter_t * f, uint_t samplerate)
30{
[c21acb9]31  uint_t order; lsmp_t *a, *b; lvec_t *as, *bs;
[a4364b8]32
[9590e81]33  if ((sint_t)samplerate <= 0) {
34    AUBIO_ERROR("aubio_filter: failed setting C-weighting with samplerate %d\n", samplerate);
35    return AUBIO_FAIL;
36  }
37  if (f == NULL) {
38    AUBIO_ERROR("aubio_filter: failed setting C-weighting with filter NULL\n");
39    return AUBIO_FAIL;
40  }
41
42  order = aubio_filter_get_order (f);
[a4364b8]43  if ( order != 5 ) {
[9590e81]44    AUBIO_ERROR ("aubio_filter: order of C-weighting filter must be 5, not %d\n", order);
[f530f12]45    return 1;
[4f4d892]46  }
[a4364b8]47
[9590e81]48  aubio_filter_set_samplerate (f, samplerate);
49  bs = aubio_filter_get_feedforward (f);
50  as = aubio_filter_get_feedback (f);
51  b = bs->data, a = as->data;
52
[a4364b8]53  /* select coefficients according to sampling frequency */
[59c046d]54  switch (samplerate) {
[a4364b8]55
56    case 8000:
57      b[0] =  6.782173932405135552414776611840352416038513183593750000e-01;
58      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
59      b[2] = -1.356434786481027110482955322368070483207702636718750000e+00;
60      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
61      b[4] =  6.782173932405135552414776611840352416038513183593750000e-01;
62      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
63      a[1] = -6.589092811505605773447769024642184376716613769531250000e-01;
64      a[2] = -1.179445664897062595599663836765103042125701904296875000e+00;
65      a[3] =  4.243329729632123736848825501510873436927795410156250000e-01;
66      a[4] =  4.147270002091348328754349950031610205769538879394531250e-01;
67      break;
68
[d1c0554]69    case 11025:
70      b[0] =  6.002357155402652244546857218665536493062973022460937500e-01;
71      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
72      b[2] = -1.200471431080530448909371443733107298612594604492187500e+00;
73      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
74      b[4] =  6.002357155402652244546857218665536493062973022460937500e-01;
75      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
76      a[1] = -8.705602141280316397242700077185872942209243774414062500e-01;
77      a[2] = -9.037199507150940336330791069485712796449661254882812500e-01;
78      a[3] =  4.758433040929530011275971901341108605265617370605468750e-01;
79      a[4] =  2.987653956523212417373258631414500996470451354980468750e-01;
80      break;
81
[a4364b8]82    case 16000:
83      b[0] =  4.971057193673903418229542694461997598409652709960937500e-01;
84      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
85      b[2] = -9.942114387347806836459085388923995196819305419921875000e-01;
86      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
87      b[4] =  4.971057193673903418229542694461997598409652709960937500e-01;
88      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
89      a[1] = -1.162322939286873690889478893950581550598144531250000000e+00;
90      a[2] = -4.771961355734982701548574368644040077924728393554687500e-01;
91      a[3] =  4.736145114694704227886745684372726827859878540039062500e-01;
92      a[4] =  1.660337524309875301131711466950946487486362457275390625e-01;
93      break;
94
95    case 22050:
96      b[0] =  4.033381299002754549754001800465630367398262023925781250e-01;
97      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
98      b[2] = -8.066762598005509099508003600931260734796524047851562500e-01;
99      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
100      b[4] =  4.033381299002754549754001800465630367398262023925781250e-01;
101      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
102      a[1] = -1.449545371157945350404361306573264300823211669921875000e+00;
103      a[2] = -1.030104190885922088583015465701464563608169555664062500e-02;
104      a[3] =  3.881857047554073680828423675848171114921569824218750000e-01;
105      a[4] =  7.171589940116777917022972133054281584918498992919921875e-02;
106      break;
107
[321eb85]108    case 24000:
109      b[0] =  3.786678621924967069745093795063439756631851196289062500e-01;
110      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
111      b[2] = -7.573357243849934139490187590126879513263702392578125000e-01;
112      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
113      b[4] =  3.786678621924967069745093795063439756631851196289062500e-01;
114      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
115      a[1] = -1.529945307555420797029910318087786436080932617187500000e+00;
116      a[2] =  1.283553182116208835061854642844991758465766906738281250e-01;
117      a[3] =  3.494608072385725350272878131363540887832641601562500000e-01;
118      a[4] =  5.217291949300089520802359288609295617789030075073242188e-02;
119      break;
120
121    case 32000:
122      b[0] =  2.977986488230693340462096330156782642006874084472656250e-01;
123      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
124      b[2] = -5.955972976461386680924192660313565284013748168945312500e-01;
125      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
126      b[4] =  2.977986488230693340462096330156782642006874084472656250e-01;
127      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
128      a[1] = -1.812455387128179218336754274787381291389465332031250000e+00;
129      a[2] =  6.425013281155662614452239722595550119876861572265625000e-01;
130      a[3] =  1.619857574578579817448087396769551560282707214355468750e-01;
131      a[4] =  7.987649713547682189807019881300220731645822525024414062e-03;
132      break;
133
[a4364b8]134    case 44100:
135      b[0] =  2.170085619492190254220531642204150557518005371093750000e-01;
136      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
137      b[2] = -4.340171238984380508441063284408301115036010742187500000e-01;
138      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
139      b[4] =  2.170085619492190254220531642204150557518005371093750000e-01;
140      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
141      a[1] = -2.134674963687040794013682898366823792457580566406250000e+00;
142      a[2] =  1.279333533236062692139967111870646476745605468750000000e+00;
143      a[3] = -1.495598460893957093453821016737492755055427551269531250e-01;
144      a[4] =  4.908700174624683852664386307651511742733418941497802734e-03;
145      break;
146
[321eb85]147    case 48000:
148      b[0] =  1.978871200263932761398422144338837824761867523193359375e-01;
149      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
150      b[2] = -3.957742400527865522796844288677675649523735046386718750e-01;
151      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
152      b[4] =  1.978871200263932761398422144338837824761867523193359375e-01;
153      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
154      a[1] = -2.219172914052801814932536217384040355682373046875000000e+00;
155      a[2] =  1.455135878947171557129536267893854528665542602539062500e+00;
156      a[3] = -2.484960738877830532800317087094299495220184326171875000e-01;
157      a[4] =  1.253882314727246607977129144728678511455655097961425781e-02;
158      break;
159
160    case 88200:
161      b[0] =  9.221909851156021020734954163344809785485267639160156250e-02;
162      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
163      b[2] = -1.844381970231204204146990832668961957097053527832031250e-01;
164      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
165      b[4] =  9.221909851156021020734954163344809785485267639160156250e-02;
166      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
167      a[1] = -2.785795902923448696952846148633398115634918212890625000e+00;
168      a[2] =  2.727736758747444145711824603495188057422637939453125000e+00;
169      a[3] = -1.097007502819661528548067508381791412830352783203125000e+00;
170      a[4] =  1.550674356752141103132913713125162757933139801025390625e-01;
171      break;
172
[a4364b8]173    case 96000:
174      b[0] =  8.182864044979756834585771230194950476288795471191406250e-02;
175      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
176      b[2] = -1.636572808995951366917154246038990095257759094238281250e-01;
177      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
178      b[4] =  8.182864044979756834585771230194950476288795471191406250e-02;
179      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
180      a[1] = -2.856378516857566829401093855267390608787536621093750000e+00;
181      a[2] =  2.897640237559524045707348705036565661430358886718750000e+00;
182      a[3] = -1.225265958339703198376469117647502571344375610351562500e+00;
183      a[4] =  1.840048283551226071530493300087982788681983947753906250e-01;
184      break;
185
186    case 192000:
187      b[0] =  2.784755468532278815940728122768632601946592330932617188e-02;
188      b[1] =  0.000000000000000000000000000000000000000000000000000000e+00;
189      b[2] = -5.569510937064557631881456245537265203893184661865234375e-02;
190      b[3] =  0.000000000000000000000000000000000000000000000000000000e+00;
191      b[4] =  2.784755468532278815940728122768632601946592330932617188e-02;
192      a[0] =  1.000000000000000000000000000000000000000000000000000000e+00;
193      a[1] = -3.333298856144166322224009491037577390670776367187500000e+00;
194      a[2] =  4.111467536240339448738723149290308356285095214843750000e+00;
195      a[3] = -2.222889041651291641699117462849244475364685058593750000e+00;
196      a[4] =  4.447204118126878991112960193277103826403617858886718750e-01;
197      break;
198
199    default:
200      AUBIO_ERROR ( "sampling rate of C-weighting filter is %d, should be one of\
[d1c0554]201 8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000, 88200, 96000, 192000.\n", 
[2cc816a]202 samplerate );
[f530f12]203      return 1;
[a4364b8]204
205  }
206
[f530f12]207  return 0;
[a4364b8]208}
209
[741bdda]210aubio_filter_t * new_aubio_filter_c_weighting (uint_t samplerate) {
211  aubio_filter_t * f = new_aubio_filter(5);
[9590e81]212  if (aubio_filter_set_c_weighting(f,samplerate) != AUBIO_OK) {
213    del_aubio_filter(f);
214    return NULL;
215  }
[4f4d892]216  return f;
217}
Note: See TracBrowser for help on using the repository browser.