[Sound-open-firmware] [PATCH 2/4] Tone: Add channel specific volume plus other fixes

Seppo Ingalsuo seppo.ingalsuo at linux.intel.com
Thu Jun 22 10:47:54 CEST 2017



On 22.06.2017 11:28, Takashi Iwai wrote:
> On Thu, 22 Jun 2017 10:04:27 +0200,
> Seppo Ingalsuo wrote:
>>
>> On 22.06.2017 04:31, Keyon Jie wrote:
>>> On 2017年06月22日 01:12, Seppo Ingalsuo wrote:
>>>> The mono tone level can be controlled per channel. A similar channel map
>>>> feature as in the volume component was added into volume command of
>>>> tone.
>>>>
>>>> The default tone frequency of 997 Hz was updated to a proper Q16.16
>>>> value.
>>>>
>>>> Moved tone function pointer set to tone_new() since it is not modified
>>>> later.
>>>>
>>>> Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo at linux.intel.com>
>>>> ---
>>>>    src/audio/tone.c | 56
>>>> ++++++++++++++++++++++++++++++++++++++++++--------------
>>>>    1 file changed, 42 insertions(+), 14 deletions(-)
>>>>
>>>> diff --git a/src/audio/tone.c b/src/audio/tone.c
>>>> index f45d8be..d1c7468 100644
>>>> --- a/src/audio/tone.c
>>>> +++ b/src/audio/tone.c
>>>> @@ -56,7 +56,8 @@
>>>>      #define TONE_NUM_FS            13       /* Table size for 8-192
>>>> kHz range */
>>>>    #define TONE_AMPLITUDE_DEFAULT 2147484  /* -60 dB from full scale */
>>>> -#define TONE_FREQUENCY_DEFAULT 16334848 /* 997 in Q18.14 */
>>>> +#define TONE_FREQUENCY_DEFAULT 65339392 /* 997 Hz in Q16.16 */
>>>> +#define TONE_VOLUME_DEFAULT 65536       /* 1.0 in Q16.16 */
>>> will they be more readable in hexadecimal?
>> Unfortunately the C preprocessor doesn't process float to fixed math
>> so I can't use any nice macro to create these. In hex it would look
>> like this and in my opinion it's not any better. The Q notation is
>> only sometimes by chance such that integer and decimal bits are not
>> mixed into same hex digit. For frequency Qx.y notation the used x is
>> sufficient to get to ultrasound frequencies and y to make precise
>> enough sweeps.
>>
>> #define TONE_AMPLITUDE_DEFAULT 0x20C49C  /* -60 dB from full scale */
>> #define TONE_FREQUENCY_DEFAULT 0xF940000 /* 997 Hz in Q18.14 */
>> #define TONE_FREQUENCY_DEFAULT 0x3E50000 /* 997 Hz in Q16.16 */
>> #define TONE_VOLUME_DEFAULT 0x10000       /* 1.0 in Q16.16 */
>>
>> To convert these with any calculator to floats when debugging code
>> (these are fractional numbers) there's extra effort needed with hex so
>> I definitely prefer decimal. Hex is good for bit masks but these are
>> not such.
> It's a fixed-point, so you can introduce a simple macro like
>
> #define TONE_FREQ_SHIFT		16
> #define TONE_FREQ(x, y)		((x) << TONE_FREQ_SHIFT | (y))
>
> then TONE_FREQUENCY_DEFAULT will be TONE_FREQ(997, 0), and so on.
> If you need to change the base shift, just change the TONE_FREQ_SHIFT
> and the rest remains as is.

Yes, that works for integers and it is readable but the needed 
frequencies are often decimal numbers in Hz. E.g. C5 note is 523.251 Hz 
or if a sweep is started from 4th third octave band the frequency would 
be 31.5 Hz.

So I myself do with Octave that I use as pocket calculator
 >> printf('%d\n',round(523.251*2^16))
34291778
 >> printf('%d\n',round(31.5*2^16))
2064384
 >> printf('%d\n',round(10^(-60/20)*2^31))
2147484

Cheers,
Seppo


>
>
> Takashi
>



More information about the Sound-open-firmware mailing list