Voice changer

racemaniac
Fri Jun 10, 2016 6:09 pm
As i said in the 10$-o-scope project, i borrowed some of its code to do a fun little project

I read you can change the pitch of a voice by sampling sound into a circular buffer, and then reading from that buffer at a different rate, so no need for fourier transformations and difficult mathematics.
So i borrowed the DMA ADC code from the scope project (altered it a bit for this purpose), and connected a MP4725 DAC to my maple mini, and had some fun testing this little trick :)

How to wire it (on a maple mini):
I2C port 1 gets a mp4725 DAC
pin 3: analog input for the microphone
pin 4: analog input for a potentiometer that will alter the pitch

How it works:
I modified the dma code of this project to
– sample slower (about 35 khz)
– sample 2 pins simultaneously iso 1 pin interleaved
– run in circular mode
– only put the data of the sound sample pin into the memory (so i’m sampling 16 bits via dma, even though the 2 channels together are writing all 32 bits of the data register). I read the other pin directly from the dataregister when i need it.

The playback
– uses i2c clockstretching for a variable sampling rate
– tries to smooth out clicks (experiment with it, seems to work fairly well)

feel free to experiment with this fun little project :)
And let me know if you find better settings for buffer size & click removal

First thing that can be tried is a higher sampling rate, you should be able to push the DAC to 60khz with this code, and the sampling rate for the microphone can naturally also go a lot faster :).
Also better would be using a timer to send the samples :), but i just quickly wrote it with a delay :).

Also fun to try, program some special effects on it:
– maybe some echo?
– i read a dalek vocie is made by multiplying a sound signal by a sine wave (i think 100hz or something like that)
– feel free to add ideas

#include <dma_private.h>
#include <libmaple/adc.h>
#include <wirish.h>
#include <libmaple/i2c.h>

#define ADC_CR1_SIMULTANEOUS 0x60000 // simultaneous mode DUAL MODE bits 19-16
#define BufferSize 2048
uint16_t bufferPos = 0;
const int8_t analogInPin = PB0;
const int8_t analogInPin2 = PA7;

uint16_t dataBuffer[BufferSize];

const uint16_t clickTreshold = 100;
uint16_t lastSample = 2048;

uint16_t* analog2 = (uint16_t*)&(ADC1->regs->DR) + 1;

int modulationDelay = 40;
int wait = 0;

void i2c_str_InitPort(i2c_dev *device, uint8_t divider);
void i2c_str_StartSending(i2c_dev *device, uint8_t address);
void i2c_str_sendBytes(i2c_dev *device, uint8_t data, uint8_t data2);
void i2c_str_ReleasePort(i2c_dev *device);
void i2c_str_StopSending(i2c_dev *device);

#define I2C_STRETCH_SB_TIMEOUT 10000 //how many times we will check the status registers to see if the device is starting

#define I2C_STRETCH_DIV_400KHZ 30
#define I2C_STRETCH_DIV_600KHZ 20
#define I2C_STRETCH_DIV_800KHZ 15
#define I2C_STRETCH_DIV_1200KHZ 10

void setup()
{
Serial.begin();
pinMode(4, INPUT_ANALOG);
setADC();
startSampling ();
i2c_str_InitPort(I2C1, I2C_STRETCH_DIV_600KHZ);
i2c_str_StartSending(I2C1, 0x60);
}

void loop()
{
uint16_t sample = dataBuffer[bufferPos];
if((uint16_t)(sample - lastSample) > clickTreshold && (uint16_t)(lastSample - sample) > clickTreshold)
{
if(sample > lastSample)
sample = lastSample + clickTreshold;
else
sample = lastSample - clickTreshold;
}
i2c_str_sendBytes(I2C1, (uint8_t)(sample>>8), sample & 255);
bufferPos = (++bufferPos)%BufferSize;
lastSample = sample;
delayMicroseconds(20 + (*analog2>>7));
}

void startSampling ()
{
dma_init(DMA1);

adc_dma_enable(ADC1);
dma_setup_transfer(DMA1, DMA_CH1, &ADC1->regs->DR, DMA_SIZE_16BITS,
dataBuffer, DMA_SIZE_16BITS, (DMA_MINC_MODE | DMA_CIRC_MODE));// Receive buffer DMA
dma_set_num_transfers(DMA1, DMA_CH1, BufferSize);
dma_enable(DMA1, DMA_CH1);
}

void setADC ()
{
// const adc_dev *dev = PIN_MAP[analogInPin].adc_device;
int pinMapADCin = PIN_MAP[analogInPin].adc_channel;
int pinMapADCin2 = PIN_MAP[analogInPin2].adc_channel;
adc_set_prescaler(ADC_PRE_PCLK2_DIV_8);
adc_set_sample_rate(ADC1, ADC_SMPR_239_5);
adc_set_sample_rate(ADC2, ADC_SMPR_239_5);

// adc_reg_map *regs = dev->regs;
adc_set_reg_seqlen(ADC1, 1);
ADC1->regs->SQR3 = pinMapADCin;
ADC1->regs->CR2 |= ADC_CR2_CONT; // | ADC_CR2_DMA; // Set continuous mode and DMA
ADC1->regs->CR1 |= ADC_CR1_SIMULTANEOUS;
ADC1->regs->CR2 |= ADC_CR2_SWSTART;

ADC2->regs->CR2 |= ADC_CR2_CONT; // ADC 2 continuos
ADC2->regs->SQR3 = pinMapADCin2;
}

void adc_dma_enable(const adc_dev * dev) {
bb_peri_set_bit(&dev->regs->CR2, ADC_CR2_DMA_BIT, 1);
}

void adc_dma_disable(const adc_dev * dev) {
bb_peri_set_bit(&dev->regs->CR2, ADC_CR2_DMA_BIT, 0);
}

static void (*i2c_str_old_error_handler)(i2c_dev *dev);

void i2c_str_InitPort(i2c_dev *device, uint8_t divider)
{
i2c_peripheral_disable(device);
i2c_bus_reset(device);
i2c_init(device);//initialize it
i2c_config_gpios(device);//configure the gpios
device->regs->CR2 = I2C_CR2_ITERREN | 36; //dma enabled, peripheral frequency is 36Mhz
device->regs->CCR = I2C_CCR_FS | divider; //default 30
device->regs->TRISE = 11;
}
void i2c_str_ReleasePort(i2c_dev *device)
{
i2c_str_StopSending(device);
}

void i2c_str_StartSending(i2c_dev *device, uint8_t address)
{
i2c_peripheral_enable(device);//enable the port
i2c_start_condition(device);//set the start condition

uint32_t sr1 = device->regs->SR1;
uint32_t sr2 = device->regs->SR2;
uint16_t wait = 0;
while(!(sr1&I2C_SR1_SB))
{
if(wait++ > I2C_STRETCH_SB_TIMEOUT)
{
i2c_peripheral_disable(device);
return;
}
sr1 = device->regs->SR1;
sr2 = device->regs->SR2;
}
i2c_write(device, address<<1);//write the address of the device you want to contact (shifted 1 to the left)
}
void i2c_str_StopSending(i2c_dev *device)
{
i2c_stop_condition(device);
i2c_peripheral_disable(device);
}

bool i2c_str_IsSending(i2c_dev *device)
{
return !(device->regs->SR1 & I2C_SR1_TXE);
}

bool i2c_str_IsError(i2c_dev *device)
{
return device->regs->SR1 & (I2C_SR1_BERR | I2C_SR1_ARLO | I2C_SR1_AF | I2C_SR1_PECERR | I2C_SR1_TIMEOUT);
}

bool i2c_str_PortEnabled(i2c_dev *device)
{
return device->regs->CR1 & I2C_CR1_PE;
}

void i2c_str_sendByte(i2c_dev *device, uint8_t data)
{
uint32_t sr1 = device->regs->SR1;
uint32_t sr2 = device->regs->SR2;
if(sr1&(I2C_SR1_BTF | I2C_SR1_TXE | I2C_SR1_ADDR))
{
i2c_write(device, data);
}
}

void i2c_str_sendBytes(i2c_dev *device, uint8_t data, uint8_t data2)
{
uint32_t sr1 = device->regs->SR1;
uint32_t sr2 = device->regs->SR2;
if(sr1&(I2C_SR1_BTF | I2C_SR1_ADDR))
{
i2c_write(device, data);
i2c_write(device, data2);
}
}


ahull
Sat Jun 11, 2016 2:08 am
I’ll need to have a play. I may adapt for one of the STM32F103 boards I have with built in DAC, or find my existing DAC board (whichever emerges from the clutter first). The STM32 as Vocoder sounds like a fun project. Exterminate.. exterminate… or maybe a touch of the Cylon voice from Battle Star Galactica. Bring on the heartless robots.

You might like to have a crack at digital ring modulation too, I think that is probably how the Daleks are synthesised.


RogerClark
Sat Jun 11, 2016 7:51 am
I have several boards with F103R’s and F103V’s both of which have built in DAC’s. So it should be possible to output directly, without using any external hardware

I suspect the big limitation is RAM, as 20k on the F103C (and even the 64k on the F103V etc), is not going to give you a very long time delay buffer to implement things like echo.

The FFT project in another thread, may produce some interesting output audio, if the audio was reconstructed from the FFT. However I think the speed of the FFT is going to be to slow to make it usable for voice changing etc, though I suppose it may create some interesting effects

(Though I’m not precisely sure how you reconstruct a waveform based on a FFT)


racemaniac
Sat Jun 11, 2016 9:52 am
RogerClark wrote:I have several boards with F103R’s and F103V’s both of which have built in DAC’s. So it should be possible to output directly, without using any external hardware

I suspect the big limitation is RAM, as 20k on the F103C (and even the 64k on the F103V etc), is not going to give you a very long time delay buffer to implement things like echo.

The FFT project in another thread, may produce some interesting output audio, if the audio was reconstructed from the FFT. However I think the speed of the FFT is going to be to slow to make it usable for voice changing etc, though I suppose it may create some interesting effects

(Though I’m not precisely sure how you reconstruct a waveform based on a FFT)


racemaniac
Sat Jun 11, 2016 8:25 pm
I’ve now hooked it up to the microphone port of my pc, and started doing some more experiments with it :)
Now settled for a buffer size of 512 samples, which seems to work best :).
And i added a ring modulation to it, and it’s also working well :)

RogerClark
Sat Jun 11, 2016 10:00 pm
Are you using a pre generated ring modulator input buffer, or generating it on the fly?

Re:FFT

i found this

https://www.dsprelated.com/showarticle/800.php

It looks like the forward FFT can be used to create an inverse FFT, wthout too much additional processing.

However, the speed of the FFT will be too slow to be usable for audio.

I was thinking that perhaps an interesting output from the FFT would be to sine wave frequencies and amplitudes of all the points on the spectrum analysis, and sum them together, (using the amplitudes from the spectum analysis)

But perhaps even this would take too long to process.


RogerClark
Sat Jun 11, 2016 10:39 pm
On a related note…

I remember the “Specdrum” for the Sinclair Zx Spectrum computer.

https://www.dsprelated.com/showarticle/800.php

I remember, as a kid, working out that this just used a resistor ladder DAC.
So somehow I got hold of the software, and built my own simple DAC, at virtually no cost.

(I’ve no idea where I would have gotten the software from, as this was pre-internet and even pre modem; so perhaps someone I knew had the real hardware etc and let me “borrow” the program)


RogerClark
Sun Jun 12, 2016 1:06 am
@racemaniac

I’ve taken a look at your code, but I don’t understand 2 things

The I2C code has a comments about DMA

device->regs->CR2 = I2C_CR2_ITERREN | 36; //dma enabled, peripheral frequency is 36Mhz

but as far as I can tell, you are not using DMA to output to I2C, you are calling i2c_write() from loop()?

You seem to be sub-sampling the input buffer into the output buffer using delayMicroseconds

Am I reading the code correctly?


racemaniac
Sun Jun 12, 2016 3:27 am
RogerClark wrote:Are you using a pre generated ring modulator input buffer, or generating it on the fly?

Re:FFT

i found this

https://www.dsprelated.com/showarticle/800.php

It looks like the forward FFT can be used to create an inverse FFT, wthout too much additional processing.

However, the speed of the FFT will be too slow to be usable for audio.

I was thinking that perhaps an interesting output from the FFT would be to sine wave frequencies and amplitudes of all the points on the spectrum analysis, and sum them together, (using the amplitudes from the spectum analysis)

But perhaps even this would take too long to process.


RogerClark
Sun Jun 12, 2016 4:22 am
Thanks

I should be able to easily modify the code to use the DAC on the F103V


racemaniac
Sun Jun 12, 2016 7:20 am
RogerClark wrote:Thanks

I should be able to easily modify the code to use the DAC on the F103V


Pito
Sun Jun 12, 2016 11:20 am
There is FFT and IFFT.
1. you must have an antialiasing filter in front of ADC, as well as some filtering at the DAC output
2. the messing with spectra for that purposes works usually:
a) you have got a ping/pong buffers
b) you do ADC into the ping one (via DMA), while in parallel you mess with FFT etc in the pong one
c) when the ping is full, DMA switches automatically the ADC stream to the pong one
d) then you do FFT etc in the ping one
e) and vice versa in a loop.
That is only way how to produce a continual onfly operation of ADC->FFT->something_do_with_spectra->IFFT->DAC
This is how it works with dspic33F.. microcontrollers. I doubt it is possible with F103.. But maybe there is a trick how to do it..
With 5000Hz sampling rate for “speech” you get 0.2secs to do FFT->something_do_with_spectra->IFFT-DAC.
Quite a lot of time ;)

RogerClark
Sun Jun 12, 2016 11:28 am
@pito

I agree.

I doubt the F103 is fast enough to use FFT for realtime audio processing.

Kinda’ related…
I did a bit of research and found that STM have an application note about a vocoder using the F103, however I’m not sure they use the term vocoder to mean what I thought it meant.
The application note, discusses recording and compression of voice using the STM32

http://www.st.com/content/ccc/resource/ … 204907.pdf

And I eventually found the example code, but it will not work with the libmaple core (or I suspect the HAL MX core) as it uses the STM32 standard peripheral lib

Anyway, just for the record here is the download page

http://www.stmcu.org/document/download/index/id-203822


Pito
Sun Jun 12, 2016 11:38 am
Speex – It seems to be compression only.

But back to Voice changer>
As I mentioned above, you get 0.2secs for playing with FFT-IFFT (1024point FFT, 5000Hz sampling rate, 2.5kHz speech bandwidth, ham radio quality).
That is a lot of time.
You do 1024FFT in 3msecs, the same time you need for IFFT.
So there is 0.194secs for playing with the Spectra (filtering, reversing, etc..).
If you master the ping/pong method with F103, you can do it..
If the RAM would be insufficient with 1024FFT, do it with 512 or 256, no big difference in quality.


RogerClark
Sun Jun 12, 2016 11:47 am
@Pito

I thought that the 1024 pt fft was being computed in 2mS

So FFT + IFFT would be 4mS for 1024 (I will round this to 5ms, but I know this is optimistic)

If this was cut down to perhaps 32 point FFT, and had corresponding decrease in time taken, it would yield perhaps 32/1024 x 5ms = 164uS
Round to 200uS perhaps….

Or did I get my maths wrong ?


Pito
Sun Jun 12, 2016 11:56 am
Again:
When you sample ADC into the ping buffer, you need 204.8ms to fill it full (5KHz sampling rate, 1024samples).
That is the TIME you have got available for the whole FFT->messingwithspectra->IFFT->DAC process within the pong buffer.
(Because you sample the ADC via DMA into the ping AND mess with FFT in pong in parallel).
A plethora of time..
Then you reverse (when the ping buffer is full – that is signalized by DMA flag or interrupt) – you start sample ADC into the pong buffer and do FFT-IFFT in the ping – again: you have got 204.8ms for playing with FFT->messingwithspectra->IFFT->DAC process within the ping buffer.
Without loosing a single sample..
Therefore it is called Ping-Pong.

The time available for FFT->messingwithspectra->IFFT->DAC process with the Ping-Pong method is:
(1/ADC_sampling_rate) * Number_of_FFT_points
Example:
1/5000*1024 = 204.8msecs


RogerClark
Sun Jun 12, 2016 12:29 pm
OK

So, we already run the ADC on DMA, and could use DMA to output to either I2C DAC or internal DAC ( on the F103RC and larger MCUs in the family)

And use 2 buffers, i.e one filling and one being processed the being output.

Yes… 200ms is loads of time.

It would be interesting, just to run such a system e.g. 1024 point fft at 5khz sampling, and listen to what the reconstructed audio, of normal speach sounds like.

To accumplish a pitch change, I presume you could just move the data so that what was in bin[n] gets moved to bin[n+ pitch_shift] albeit this is granular.


Pito
Sun Jun 12, 2016 12:38 pm
I can guarantee it will work :)
You can do with spectral lines what you want (with some limitations, subject to rocket science :) ).
You can make filters (by cutting the lines off – low, highpass, notch) or moving the lines up/down (to change the pitch], or reverse the spectra (to encrypt), or noise/denoise, mix, etc, etc. There are tons of books written about that matter :)

RogerClark
Sun Jun 12, 2016 12:43 pm
@pito

Thanks


racemaniac
Sun Jun 12, 2016 6:48 pm
Pito wrote:Again:
When you sample ADC into the ping buffer, you need 204.8ms to fill it full (5KHz sampling rate, 1024samples).

RogerClark
Sun Jun 12, 2016 10:25 pm
I hadn’t realised that 35khz was the minimum sample rate.

But I think it should be OK, it just gives far less time to process the audio when in the Fourier domain. So rather than around 200ms, there would only be around 30mS

Input FFT takes 2mS for 1024 points. Output FFT will take about the same.

So that leaves around 25mS for processing 1024 points (512 pairs)

Which sounds like it should be enough to do some processing.

But, there is always a chance I overlooked something which kills the whole idea


ddrown
Sun Jun 12, 2016 10:33 pm
racemaniac wrote:Pito wrote:Again:
When you sample ADC into the ping buffer, you need 204.8ms to fill it full (5KHz sampling rate, 1024samples).

RogerClark
Sun Jun 12, 2016 10:46 pm
Ok about decimation.

I think it may be best to try to filter extenally, e.g. just use a normal R C filter, at perhaps 5kHz, so that any signals at 17khz would be so small they would be inaudible


RogerClark
Mon Jun 13, 2016 5:48 am
racemaniac wrote:Pito wrote:Again:
When you sample ADC into the ping buffer, you need 204.8ms to fill it full (5KHz sampling rate, 1024samples).

racemaniac
Mon Jun 13, 2016 6:09 am
RogerClark wrote:racemaniac wrote:Pito wrote:Again:
When you sample ADC into the ping buffer, you need 204.8ms to fill it full (5KHz sampling rate, 1024samples).

Pito
Mon Jun 13, 2016 7:05 am
I am not an expert for ADC and DMA with STM32, but I am quite surprised you cannot set sampling rate to say 5kHz (or 100Hz or 0.5Hz).
Usually you do not set ADC sampling rate by the ADC clock dividers, but via ADC conversion trigger, which could be, for example, driven by a timer’s output pulse/edge/period/PWM, etc..

Example> Set ADC clock to 13 clock cycles (as fast as you can for given ADC precision), set timerX to trigger the ADC conversion every 200usecs (5KHz Sampling rate), and do direct the ADC output via DMA to a buffer called Buffer_Ping[1024]. A nice to have would be if the DMA can signal the Buffer_PIng is full (in order to switch to Pong).
The same story with DAC (shoot data from Buffer_Pong out through DAC via DMA, the sampling is given by timerY set to ie 200usecs).

A typical setup I’ve found somewhere:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; <<< here you set the ADC Sampling rate as you wish :) (or better to say as the Timer1 “allows”) :)

/* TIM1 configuration ------------------------------------------------------*/
/* Time Base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x4;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* TIM1 channel1 configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0x7F;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* DMA1 Channel1 Configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);


racemaniac
Mon Jun 13, 2016 7:28 am
Pito wrote:I am not an expert for ADC and DMA with STM32, but I am quite surprised you cannot set sampling rate to say 5kHz (or 100Hz or 0.5Hz).
Usually you do not set ADC sampling rate by the ADC clock dividers, but via ADC conversion trigger, which could be, for example, driven by a timer’s output pulse/edge/period/PWM, etc..
Example> Set ADC clock to 10MHz, set timerX to trigger the ADC conversion every 200usecs (5KHz), and do direct the ADC output via DMA to a buffer called Buffer_Ping[1024]. A nice to have would be if the DMA can signal the Buffer_PIng is full (in order to switch to Pong).
The same story with DAC (shoot data from Buffer_Pong out through DAC via DMA, the sampling is given by timerY set to ie 200usecs).
A typical setup I’ve found somewhere:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; <<< here you set the ADC Sampling rate as you wish :) (or better as the Timer1 allows) :)

/* TIM1 configuration ------------------------------------------------------*/
/* Time Base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x4;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* TIM1 channel1 configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0x7F;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* DMA1 Channel1 Configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);


Pito
Mon Jun 13, 2016 7:35 am
Yes, exactly as you wrote.
“ADC sampling speed/rate” is one thing, and the number of CPU/AHB clocks (conversion speed) for a single ADC conversion is an another one.
They are not related (until some limits).
So I set ADC to full conversion speed (ie 15MHz for 12bit, it depends on MCU) and the Sampling rate I set via TimerX pwm to any value I want.
The same with DAC (there must be a way how to do it).

For example you may have ADC (set to 15MHz conversion speed) working at 4KHz Sampling rate, doing DSP, and outputting the signal via DAC with Sampling speed (DAC sampling speed) of 6KHz (it may sound like Mickey Mouse) :P


RogerClark
Mon Jun 13, 2016 7:41 am
@racemaniac

It must be possible to control the rate at which DMA data is sent to the DAC,

STM have an application note on the DAC, but its really just an overview showing the capabilities of the DAC

http://www.st.com/content/ccc/resource/ … 259245.pdf

I suspect that the DMA controller will need to be triggered by a Timer, and hence the Timer freq sets the sample rate.

Or in this case, if possible, perhaps the best method is to use the ADC (conversion complete) to trigger the DAC DMA; as both the input an output are supposed to be running at precisely the same sample rate

Or perhaps run both the ADC and the DAC on the same Timer

Edit. I found some OpenLibCM3 code that uses the timer to control the DMA for the DAC

https://github.com/libopencm3/libopencm … /dac-dma.c


racemaniac
Mon Jun 13, 2016 7:46 am
RogerClark wrote:@racemaniac

It must be possible to control the rate at which DMA data is sent to the DAC,

STM have an application note on the DAC, but its really just an overview showing the capabilities of the DAC

http://www.st.com/content/ccc/resource/ … 259245.pdf

I suspect that the DMA controller will need to be triggered by a Timer, and hence the Timer freq sets the sample rate.

Or in this case, if possible, perhaps the best method is to use the ADC (conversion complete) to trigger the DAC DMA; as both the input an output are supposed to be running at precisely the same sample rate

Or perhaps run both the ADC and the DAC on the same Timer

Edit. I found some OpenLibCM3 code that uses the timer to control the DMA for the DAC

https://github.com/libopencm3/libopencm … /dac-dma.c


Pito
Mon Jun 13, 2016 7:47 am
Here are some examples for ADC and DAC stuff (via DMA) for experts (I’ve taken the code ADC/TIM1 example from there):

http://elk.informatik.fh-augsburg.de/pu … mples.html


racemaniac
Mon Jun 13, 2016 7:55 am
Pito wrote:Here are some examples for ADC and DAC stuff (via DMA) for experts (I’ve taken the code ADC/TIM1 example from there):

http://elk.informatik.fh-augsburg.de/pu … mples.html


RogerClark
Tue Jun 14, 2016 10:31 pm
Guys

At the moment it looks like a FFT based voice changer is dead in the water, because I would need to write the Inverse FFT in assembler myself. Which is impractical as I have no knowledge of FFTs or ARM assembler.

However, technically it does seem feasible that it would work on the F103.

Its just a shame that none of the old Inverse FFT code that @pito found, will compile on modern versions of gcc.
i.e there is a version of FFT and IFFT which dates to 2008, which looks like it would do the job, but it won’t compile ( assemble ) with gcc 4.4, as strangely there are problems with the assembler instructions missing paramaters.

I wonder if there is an ARM users forum somewhere, which I could post the code to, and try to find out how to update it.
But at the moment I’m stumped…


RogerClark
Tue Jun 14, 2016 10:59 pm
Just for reference purposes

Here is the FFT that @pito found, but which doesn’t compile :-(

FFTCM3.S
/* Complex 16 bit Radix 4 FFT and Inverse FFT for Cortex-M3 version 1.0
--------------------------------------------------------------------------
(c) 2008 Ivan Mellen
--------------------------------------------------------------------------
Free Personal, Non-Commercial Use License.
The Software is licensed to you for your personal, NON-COMMERCIAL USE.
If you have questions about this license or would like a different license
please email : imellen(at)embeddedsignals(dot)com

- Radix 4 FFT - supported sizes: N=4,16,64,256,1024,4096
- N>4096 possible with custom coefficients
- 16 bit complex arithmetic, 1Q15 coefficients
- input data remains unmodified
- decimation-in-time with auto scale after each stage - no overflow
- GCC version (Code Sourcery G++ Lite 2007q3-53), requires C preprocessor
- hand optimized THUMB2 assembly for Cortex-M3 (e.g. STM32)
- code optimized with 64 bit flash prefetch and branch speculation in mind
- single function for multiple FFT sizes
- functions are both "C" and assembly callable

Modifications in version 2.0:
- Constant size FFT (faster execution, but N is constant)
- purely real input (almost 2x faster)
- radix 2 stage (for N= 8, 32, 128, 512, 2048, 8192...)
- RAM based coefficients with size optimized generator (for high flash latency)
- speed optimized windowing function(Bartlett,Blackman, Hamming, Hanning, Kaiser)

STM32 FFT benchmarks in CPU cycles based on real hardware measurements:

N - FFT size
L - Flash latency
F,R - coefficients in Flash or RAM

N L=0 F/R L=1 F L=1 r* L=2 F* L=2 r* ARM7TDMI ARM9E dsPIC
64 3575 3797 3636 4588 4007 - 2701 3739
256 19425 20685 19743 25144 21685 38461-43920 13740 19055
1024 98541 105113 100074 128070 109634 - 68534 N/A

Notes:ARM9E - DSP enhanced arm9 core, based on STR910 @96 MHz, RAM coefficients
dsPIC - dsPIC30x / dsPIC33x - results based on Microchip's DSP library
ARM7TDMI - 3rd party, web based benchmark results
*STM32 results for latency L=2 or - source compiled with LATENCY2 defined

IFFT benchmarks (calculated and verified by measurement):
add 6+N/4 to FFT benchmark {22,70,262} for N={64,256,1024}

Code size:
FFT only: 480 bytes
FFT+IFFT: 682 bytes

Coefficient size (Flash or RAM):
N: 16 64 256 1024 4096
size: 48 240 1008 4080 16368 bytes

------------------------------------------------------------------------------
Usage example: add this file to your project. In C code:

//declare functions
void fftR4(short *y, short *x, int N);
void ifftR4(short *y, short *x, int N);

// prepare test input data
short x[512]; // input data 16 bit, 4 byte aligned x0r,x0i,x1r,x1i,....
short y[512]; // output data 16 bit,4 byte aligned y0r,y0i,y1r,y1i,....
short z[512]; // same format...

for (i=0;i
for (i=0;i
{ x[i+0]=16384; x[i+2]=16384; x[i+4]=-16384; x[i+6]=-16384;}
// x = [ 16384,16384,-16384,-16384,16384,...] 1/4 Fsampling

//call functions
fftR4(y, x, 256); // y is in frequency domain y[128]=
ifftR4(z, y, 256); // z should be x/N + noise introduced by 16 bit truncating

// expected results:
//y[128]is 8191; y[129] is -8190 y[384]is 8191; y[385]is 8191 rest 0 + noise
//z[2n] is 64 64 -64 -64 .. z[2n+1] is 0 all +- 1 (noise)
------------------------------------------------------------------------------
*/

// This file contains two functions :

// void fftR4(short *y, short *x, int N); // radix 4 FFT
// void ifftR4(short *y, short *x, int N); // radix 4 inverse FFT

.syntax unified
.thumb
.global fftR4
.global ifftR4

//#define LATENCY2 //comment this line if flash latency

#define y R0 // short *y -output complex array
#define x R1 // short *x -input complex array
#define N R2 // int N - number of samples 4,16,64,256,1024,4096

#define c R0 // short *c - coefficient array
#define Bl R2 // the number of blocks
#define R R3 // the number of samples in each block
#define x0r R4
#define x0i R5
#define x1r R6
#define x1i R7
#define x2r R8
#define x2i R9
#define x3r R10
#define x3i R11
#define y3r x3i
#define y3i x3r
#define tmp0 R12 // temporary0
#define tmp1 R14 // temporary1

// complex load, x=[a], a+=offset in register data from RAM (0 wait states)

.macro LOADC dr,di, a, offset //5 cycles
ldrsh di, [a, #2] ldrsh dr, [a] //ldrsh $x._r, [$a], $offset
adds a, offset
.endm

// cofficient complex load, c=[a], a=a+ 4 ;Wk from FLASH (1-4 wait states)
.macro LOADCF xr,xi, a //4 cycles
ldr xr, [a], #4 //read 2 shorts as 32 bits
asr xi, xr,#16 //im extract
sxth xr,xr //re extract
.endm

// coefficient complex load, c=[a], a=a+ 4 ; Wk from RAM (0 wait states)
// .macro LOADCF xr,xi, a //4 (or 3?) cycles
// ldrsh xi, [$a, #2] // ldrsh xr, [$a],#4 //ldrsh not pipelined in STM32, macro not used
// .endm

// complex load, xc=[a], a=a-register offset
.macro LOADCMi xr,xi, a, offset //5 cycles
ldrsh xi, [a, #2] ldrsh xr, [a] subs a, offset //ldrsh xr, [$a], offset
.endm

// complex store, [a]=x,c a=a+ immediate offset
.macro STRC xr,xi, a, offset //2 cycles
strh xi, [a, #2] strh xr, [a], offset
.endm

// complex store, [a]=x, a+=offset in register
.macro STRCR xr,xi, a, offset //3 cycles
strh xi, [a, #2] strh xr, [a] adds a, offset
.endm

// Multiply Complex Conjugate a=(xr+i*xi)*(cr-i*ci)
// x = xr + i*xi
// c = cr + i*ci ;6 cycles
.macro MULCC ar,ai, xr,xi,cr,ci
mul tmp0, xi, cr // tmp0=xi*cr
mul tmp1, xi, ci // tmp1=xi*ci
mls ai, xr, ci,tmp0 // ai=tmp0-xr*ci = xi*cr - xr*ci
mla ar, xr, cr,tmp1 // ar=tmp1+xr*cr = xr*cr + xi*ci
.endm

// complex Fast Fourier Transform - Four point; scale with shift s
.macro BFFT4 s

add x2r, x2r, x3r // (x2,x3) = (x2+x3, x2-x3)
add x2i, x2i, x3i
sub x3r, x2r, x3r, lsl#1
sub x3i, x2i, x3i, lsl#1

mov x0r, x0r, asr#2 // (x0,x1) = (x0+(x1>>s), x0-(x1>>s))/4
mov x0i, x0i, asr#2
add x0r, x0r, x1r, asr#(2+s)
add x0i, x0i, x1i, asr#(2+s)
sub x1r, x0r, x1r, asr#(1+s)
sub x1i, x0i, x1i, asr#(1+s)

add x0r, x0r, x2r, asr#(2+s) // (x0,x2) = (x0+(x2>>s)/4, x0-(x2>>s)/4)
add x0i, x0i, x2i, asr#(2+s)
sub x2r, x0r, x2r, asr#(1+s)
sub x2i, x0i, x2i, asr#(1+s)

add x1r, x1r, x3i, asr#(2+s) // (x1,y3)=(x1-i*(x3>>s)/4, x1+i*(x3>>s)/4)
sub x1i, x1i, x3r, asr#(2+s)
sub y3r, x1r, x3i, asr#(1+s)
add y3i, x1i, x3r, asr#(1+s)
.endm

//----------------------------------------------------------------------------
// inverse FFT
// void ifftR4(short *y, short *x, int N)
// custom first stage reorders input data: x(n)=x(N-n) n=0:N-1 x(N)=x(0)
// extra cost to fft: 6+N/4 cycles
.thumb_func
.align 3 //speed optimization in STM32
nop.n //alignment optimization

ifftR4: stmfd sp!, {r4-r11, lr}
mov tmp0, #0 // bit reversed counter
movs tmp1,N //; first tmp1=N
.word 0xF3A2FA92 //RBIT R3,R2 //RBIT R,N
lsl R,#3

adds tmp1, x, tmp1, lsl#2 // tmp1=&x[tmp1==N] ldrsh x0i, [x, #2] // replaces C_LDRmi x[N] by _LDRmi x[0] ldrsh x0r, [x] subs tmp1,N //tmp1 still needs to be decremented for 2nd C_LDRmi
b L2 // continue with second load

ifirstStage:
// first stage load and bit reverse
adds tmp1, x, tmp1, lsl#2 // tmp1=&x[tmp1] LOADCMi x0r,x0i, tmp1, N
L2: LOADCMi x2r,x2i, tmp1, N
LOADCMi x1r,x1i, tmp1, N
LOADCMi x3r,x3i, tmp1, N
BFFT4 0
STRC x0r,x0i, y, #4
STRC x1r,x1i, y, #4
STRC x2r,x2i, y, #4
STRC y3r,y3i, y, #4

adds tmp0,R
.word 0xFEACFA9C // rbit r14,r12//rbit tmp1,tmp0
sub tmp1,N,tmp1 //tmp1=N-tmp1
bne ifirstStage // loop if count non zero
b firstStageFinished
// rest same as normal fft

//----------------------------------------------------------------------------
// void fftR4(short *y, short *x, int N)
.thumb_func
fftR4: stmfd sp!, {r4-r11, lr}
mov tmp0, #0 // bit reversed counter
mov tmp1, #0
.word 0xF3A2FA92 //rbit R3,R2 //RBIT R,N
lsl R,#3

firstStage:
// first stage load and bit reverse
adds tmp1, x, tmp1, lsl#2 // tmp1=&x[tmp1] and clear carry
LOADC x0r, x0i, tmp1, N
LOADC x2r,x2i, tmp1, N
LOADC x1r,x1i, tmp1, N
LOADC x3r,x3i, tmp1, N
BFFT4 0
STRC x0r,x0i, y, #4
STRC x1r,x1i, y, #4
STRC x2r,x2i, y, #4
STRC y3r,y3i, y, #4

adds tmp0,R
.word 0xFEACFA9C // rbit r14,r12//rbit tmp1,tmp0
bne firstStage // loop if count non zero

firstStageFinished: // finished the first stage
sub x, y, N, lsl #2 // x = working buffer
mov R, #16
lsrs Bl,N,4
it eq
ldmeq sp!, {r4-r11, pc} // for N==4 return from function
adr c, coef_table //change if table in RAM

nextStage:
// Bl = the number of blocks
// R = the number of samples in each block

#ifdef LATENCY2 // narrow/wide versions to optimize flash pre-fetch
stm sp!, {x, Bl}
add tmp0, R, R, lsl#1
add.n x, x, tmp0
#else
stmfd sp!, {x, Bl}
add tmp0, R, R, lsl#1
add.w x, x, tmp0
#endif
sub Bl, Bl, #1<
nextBlock:
add Bl, Bl, R, lsl#(16-2)

nextButterfly:
// Bl=((number butterflies left-1)<
LOADCMi x0r,x0i, x, R
LOADCF x3r,x3i, c
MULCC x3r,x3i, x0r,x0i, x3r,x3i
LOADCMi x0r,x0i, x, R
LOADCF x2r,x2i, c
MULCC x2r,x2i, x0r,x0i, x2r,x2i
LOADCMi x0r,x0i, x, R
LOADCF x1r,x1i, c
MULCC x1r,x1i, x0r,x0i, x1r,x1i
LOADC x0r,x0i, x, #0
BFFT4 15 // coefficients are 1Q15
STRCR x0r,x0i, x, R
STRCR x1r,x1i, x, R
STRCR x2r,x2i, x, R
STRC y3r,y3i, x, #4
subs Bl, Bl, #1<
bge nextButterfly
add tmp0, R, R, lsl#1
add x, x, tmp0
sub Bl, Bl, #1
movs tmp1, Bl, lsl#16
it ne
subne c, c, tmp0
bne nextBlock

pop {r1-r2} //LDM sp!, {x, Bl}
mov R, R, lsl#2 // block size *=4
lsrs Bl,Bl,2 //# of blocks /=4
bne nextStage
ldmfd sp!, {r4-r11, pc} //return

.align 2 //32 bit access acceleration

// Note: unused portion of coef_table can be commented to reduce size
coef_table:
// FFT twiddle table of triplets E(3t), E(t), E(2t)
// Where E(t)=cos(t)+i*sin(t) at 1Q15
// N=16 t=2*PI*k/N for k=0,1,2,..,N/4-1
.hword 0x7fff,0x0000, 0x7fff,0x0000, 0x7fff,0x0000
.hword 0x30fc,0x7642, 0x7642,0x30fc, 0x5a82,0x5a82
.hword 0xa57e,0x5a82, 0x5a82,0x5a82, 0x0000,0x7fff
.hword 0x89be,0xcf04, 0x30fc,0x7642, 0xa57e,0x5a82
// N=64 t=2*PI*k/N for k=0,1,2,..,N/4-1
.hword 0x7fff,0x0000, 0x7fff,0x0000, 0x7fff,0x0000
.hword 0x7a7d,0x2528, 0x7f62,0x0c8c, 0x7d8a,0x18f9
.hword 0x6a6e,0x471d, 0x7d8a,0x18f9, 0x7642,0x30fc
.hword 0x5134,0x62f2, 0x7a7d,0x2528, 0x6a6e,0x471d
.hword 0x30fc,0x7642, 0x7642,0x30fc, 0x5a82,0x5a82
.hword 0x0c8c,0x7f62, 0x70e3,0x3c57, 0x471d,0x6a6e
.hword 0xe707,0x7d8a, 0x6a6e,0x471d, 0x30fc,0x7642
.hword 0xc3a9,0x70e3, 0x62f2,0x5134, 0x18f9,0x7d8a
.hword 0xa57e,0x5a82, 0x5a82,0x5a82, 0x0000,0x7fff
.hword 0x8f1d,0x3c57, 0x5134,0x62f2, 0xe707,0x7d8a
.hword 0x8276,0x18f9, 0x471d,0x6a6e, 0xcf04,0x7642
.hword 0x809e,0xf374, 0x3c57,0x70e3, 0xb8e3,0x6a6e
.hword 0x89be,0xcf04, 0x30fc,0x7642, 0xa57e,0x5a82
.hword 0x9d0e,0xaecc, 0x2528,0x7a7d, 0x9592,0x471d
.hword 0xb8e3,0x9592, 0x18f9,0x7d8a, 0x89be,0x30fc
.hword 0xdad8,0x8583, 0x0c8c,0x7f62, 0x8276,0x18f9
// N=256 t=2*PI*k/N for k=0,1,2,..,N/4-1
.hword 0x7fff,0x0000, 0x7fff,0x0000, 0x7fff,0x0000
.hword 0x7fa7,0x096b, 0x7ff6,0x0324, 0x7fd9,0x0648
.hword 0x7e9d,0x12c8, 0x7fd9,0x0648, 0x7f62,0x0c8c
.hword 0x7ce4,0x1c0c, 0x7fa7,0x096b, 0x7e9d,0x12c8
.hword 0x7a7d,0x2528, 0x7f62,0x0c8c, 0x7d8a,0x18f9
.hword 0x776c,0x2e11, 0x7f0a,0x0fab, 0x7c2a,0x1f1a
.hword 0x73b6,0x36ba, 0x7e9d,0x12c8, 0x7a7d,0x2528
.hword 0x6f5f,0x3f17, 0x7e1e,0x15e2, 0x7885,0x2b1f
.hword 0x6a6e,0x471d, 0x7d8a,0x18f9, 0x7642,0x30fc
.hword 0x64e9,0x4ec0, 0x7ce4,0x1c0c, 0x73b6,0x36ba
.hword 0x5ed7,0x55f6, 0x7c2a,0x1f1a, 0x70e3,0x3c57
.hword 0x5843,0x5cb4, 0x7b5d,0x2224, 0x6dca,0x41ce
.hword 0x5134,0x62f2, 0x7a7d,0x2528, 0x6a6e,0x471d
.hword 0x49b4,0x68a7, 0x798a,0x2827, 0x66d0,0x4c40
.hword 0x41ce,0x6dca, 0x7885,0x2b1f, 0x62f2,0x5134
.hword 0x398d,0x7255, 0x776c,0x2e11, 0x5ed7,0x55f6
.hword 0x30fc,0x7642, 0x7642,0x30fc, 0x5a82,0x5a82
.hword 0x2827,0x798a, 0x7505,0x33df, 0x55f6,0x5ed7
.hword 0x1f1a,0x7c2a, 0x73b6,0x36ba, 0x5134,0x62f2
.hword 0x15e2,0x7e1e, 0x7255,0x398d, 0x4c40,0x66d0
.hword 0x0c8c,0x7f62, 0x70e3,0x3c57, 0x471d,0x6a6e
.hword 0x0324,0x7ff6, 0x6f5f,0x3f17, 0x41ce,0x6dca
.hword 0xf9b8,0x7fd9, 0x6dca,0x41ce, 0x3c57,0x70e3
.hword 0xf055,0x7f0a, 0x6c24,0x447b, 0x36ba,0x73b6
.hword 0xe707,0x7d8a, 0x6a6e,0x471d, 0x30fc,0x7642
.hword 0xdddc,0x7b5d, 0x68a7,0x49b4, 0x2b1f,0x7885
.hword 0xd4e1,0x7885, 0x66d0,0x4c40, 0x2528,0x7a7d
.hword 0xcc21,0x7505, 0x64e9,0x4ec0, 0x1f1a,0x7c2a
.hword 0xc3a9,0x70e3, 0x62f2,0x5134, 0x18f9,0x7d8a
.hword 0xbb85,0x6c24, 0x60ec,0x539b, 0x12c8,0x7e9d
.hword 0xb3c0,0x66d0, 0x5ed7,0x55f6, 0x0c8c,0x7f62
.hword 0xac65,0x60ec, 0x5cb4,0x5843, 0x0648,0x7fd9
.hword 0xa57e,0x5a82, 0x5a82,0x5a82, 0x0000,0x7fff
.hword 0x9f14,0x539b, 0x5843,0x5cb4, 0xf9b8,0x7fd9
.hword 0x9930,0x4c40, 0x55f6,0x5ed7, 0xf374,0x7f62
.hword 0x93dc,0x447b, 0x539b,0x60ec, 0xed38,0x7e9d
.hword 0x8f1d,0x3c57, 0x5134,0x62f2, 0xe707,0x7d8a
.hword 0x8afb,0x33df, 0x4ec0,0x64e9, 0xe0e6,0x7c2a
.hword 0x877b,0x2b1f, 0x4c40,0x66d0, 0xdad8,0x7a7d
.hword 0x84a3,0x2224, 0x49b4,0x68a7, 0xd4e1,0x7885
.hword 0x8276,0x18f9, 0x471d,0x6a6e, 0xcf04,0x7642
.hword 0x80f6,0x0fab, 0x447b,0x6c24, 0xc946,0x73b6
.hword 0x8027,0x0648, 0x41ce,0x6dca, 0xc3a9,0x70e3
.hword 0x800a,0xfcdc, 0x3f17,0x6f5f, 0xbe32,0x6dca
.hword 0x809e,0xf374, 0x3c57,0x70e3, 0xb8e3,0x6a6e
.hword 0x81e2,0xea1e, 0x398d,0x7255, 0xb3c0,0x66d0
.hword 0x83d6,0xe0e6, 0x36ba,0x73b6, 0xaecc,0x62f2
.hword 0x8676,0xd7d9, 0x33df,0x7505, 0xaa0a,0x5ed7
.hword 0x89be,0xcf04, 0x30fc,0x7642, 0xa57e,0x5a82
.hword 0x8dab,0xc673, 0x2e11,0x776c, 0xa129,0x55f6
.hword 0x9236,0xbe32, 0x2b1f,0x7885, 0x9d0e,0x5134
.hword 0x9759,0xb64c, 0x2827,0x798a, 0x9930,0x4c40
.hword 0x9d0e,0xaecc, 0x2528,0x7a7d, 0x9592,0x471d
.hword 0xa34c,0xa7bd, 0x2224,0x7b5d, 0x9236,0x41ce
.hword 0xaa0a,0xa129, 0x1f1a,0x7c2a, 0x8f1d,0x3c57
.hword 0xb140,0x9b17, 0x1c0c,0x7ce4, 0x8c4a,0x36ba
.hword 0xb8e3,0x9592, 0x18f9,0x7d8a, 0x89be,0x30fc
.hword 0xc0e9,0x90a1, 0x15e2,0x7e1e, 0x877b,0x2b1f
.hword 0xc946,0x8c4a, 0x12c8,0x7e9d, 0x8583,0x2528
.hword 0xd1ef,0x8894, 0x0fab,0x7f0a, 0x83d6,0x1f1a
.hword 0xdad8,0x8583, 0x0c8c,0x7f62, 0x8276,0x18f9
.hword 0xe3f4,0x831c, 0x096b,0x7fa7, 0x8163,0x12c8
.hword 0xed38,0x8163, 0x0648,0x7fd9, 0x809e,0x0c8c
.hword 0xf695,0x8059, 0x0324,0x7ff6, 0x8027,0x0648
// N=1024 t=2*PI*k/N for k=0,1,2,..,N/4-1
.hword 0x7fff,0x0000, 0x7fff,0x0000, 0x7fff,0x0000
.hword 0x7ffa,0x025b, 0x7fff,0x00c9, 0x7ffe,0x0192
.hword 0x7fea,0x04b6, 0x7ffe,0x0192, 0x7ff6,0x0324
.hword 0x7fce,0x0711, 0x7ffa,0x025b, 0x7fea,0x04b6
.hword 0x7fa7,0x096b, 0x7ff6,0x0324, 0x7fd9,0x0648
.hword 0x7f75,0x0bc4, 0x7ff1,0x03ed, 0x7fc2,0x07d9
.hword 0x7f38,0x0e1c, 0x7fea,0x04b6, 0x7fa7,0x096b
.hword 0x7ef0,0x1073, 0x7fe2,0x057f, 0x7f87,0x0afb
.hword 0x7e9d,0x12c8, 0x7fd9,0x0648, 0x7f62,0x0c8c
.hword 0x7e3f,0x151c, 0x7fce,0x0711, 0x7f38,0x0e1c
.hword 0x7dd6,0x176e, 0x7fc2,0x07d9, 0x7f0a,0x0fab
.hword 0x7d63,0x19be, 0x7fb5,0x08a2, 0x7ed6,0x113a
.hword 0x7ce4,0x1c0c, 0x7fa7,0x096b, 0x7e9d,0x12c8
.hword 0x7c5a,0x1e57, 0x7f98,0x0a33, 0x7e60,0x1455
.hword 0x7bc6,0x209f, 0x7f87,0x0afb, 0x7e1e,0x15e2
.hword 0x7b27,0x22e5, 0x7f75,0x0bc4, 0x7dd6,0x176e
.hword 0x7a7d,0x2528, 0x7f62,0x0c8c, 0x7d8a,0x18f9
.hword 0x79c9,0x2768, 0x7f4e,0x0d54, 0x7d3a,0x1a83
.hword 0x790a,0x29a4, 0x7f38,0x0e1c, 0x7ce4,0x1c0c
.hword 0x7840,0x2bdc, 0x7f22,0x0ee4, 0x7c89,0x1d93
.hword 0x776c,0x2e11, 0x7f0a,0x0fab, 0x7c2a,0x1f1a
.hword 0x768e,0x3042, 0x7ef0,0x1073, 0x7bc6,0x209f
.hword 0x75a6,0x326e, 0x7ed6,0x113a, 0x7b5d,0x2224
.hword 0x74b3,0x3497, 0x7eba,0x1201, 0x7aef,0x23a7
.hword 0x73b6,0x36ba, 0x7e9d,0x12c8, 0x7a7d,0x2528
.hword 0x72af,0x38d9, 0x7e7f,0x138f, 0x7a06,0x26a8
.hword 0x719e,0x3af3, 0x7e60,0x1455, 0x798a,0x2827
.hword 0x7083,0x3d08, 0x7e3f,0x151c, 0x790a,0x29a4
.hword 0x6f5f,0x3f17, 0x7e1e,0x15e2, 0x7885,0x2b1f
.hword 0x6e31,0x4121, 0x7dfb,0x16a8, 0x77fb,0x2c99
.hword 0x6cf9,0x4326, 0x7dd6,0x176e, 0x776c,0x2e11
.hword 0x6bb8,0x4524, 0x7db1,0x1833, 0x76d9,0x2f87
.hword 0x6a6e,0x471d, 0x7d8a,0x18f9, 0x7642,0x30fc
.hword 0x691a,0x490f, 0x7d63,0x19be, 0x75a6,0x326e
.hword 0x67bd,0x4afb, 0x7d3a,0x1a83, 0x7505,0x33df
.hword 0x6657,0x4ce1, 0x7d0f,0x1b47, 0x7460,0x354e
.hword 0x64e9,0x4ec0, 0x7ce4,0x1c0c, 0x73b6,0x36ba
.hword 0x6371,0x5098, 0x7cb7,0x1cd0, 0x7308,0x3825
.hword 0x61f1,0x5269, 0x7c89,0x1d93, 0x7255,0x398d
.hword 0x6068,0x5433, 0x7c5a,0x1e57, 0x719e,0x3af3
.hword 0x5ed7,0x55f6, 0x7c2a,0x1f1a, 0x70e3,0x3c57
.hword 0x5d3e,0x57b1, 0x7bf9,0x1fdd, 0x7023,0x3db8
.hword 0x5b9d,0x5964, 0x7bc6,0x209f, 0x6f5f,0x3f17
.hword 0x59f4,0x5b10, 0x7b92,0x2162, 0x6e97,0x4074
.hword 0x5843,0x5cb4, 0x7b5d,0x2224, 0x6dca,0x41ce
.hword 0x568a,0x5e50, 0x7b27,0x22e5, 0x6cf9,0x4326
.hword 0x54ca,0x5fe4, 0x7aef,0x23a7, 0x6c24,0x447b
.hword 0x5303,0x616f, 0x7ab7,0x2467, 0x6b4b,0x45cd
.hword 0x5134,0x62f2, 0x7a7d,0x2528, 0x6a6e,0x471d
.hword 0x4f5e,0x646c, 0x7a42,0x25e8, 0x698c,0x486a
.hword 0x4d81,0x65de, 0x7a06,0x26a8, 0x68a7,0x49b4
.hword 0x4b9e,0x6747, 0x79c9,0x2768, 0x67bd,0x4afb
.hword 0x49b4,0x68a7, 0x798a,0x2827, 0x66d0,0x4c40
.hword 0x47c4,0x69fd, 0x794a,0x28e5, 0x65de,0x4d81
.hword 0x45cd,0x6b4b, 0x790a,0x29a4, 0x64e9,0x4ec0
.hword 0x43d1,0x6c8f, 0x78c8,0x2a62, 0x63ef,0x4ffb
.hword 0x41ce,0x6dca, 0x7885,0x2b1f, 0x62f2,0x5134
.hword 0x3fc6,0x6efb, 0x7840,0x2bdc, 0x61f1,0x5269
.hword 0x3db8,0x7023, 0x77fb,0x2c99, 0x60ec,0x539b
.hword 0x3ba5,0x7141, 0x77b4,0x2d55, 0x5fe4,0x54ca
.hword 0x398d,0x7255, 0x776c,0x2e11, 0x5ed7,0x55f6
.hword 0x3770,0x735f, 0x7723,0x2ecc, 0x5dc8,0x571e
.hword 0x354e,0x7460, 0x76d9,0x2f87, 0x5cb4,0x5843
.hword 0x3327,0x7556, 0x768e,0x3042, 0x5b9d,0x5964
.hword 0x30fc,0x7642, 0x7642,0x30fc, 0x5a82,0x5a82
.hword 0x2ecc,0x7723, 0x75f4,0x31b5, 0x5964,0x5b9d
.hword 0x2c99,0x77fb, 0x75a6,0x326e, 0x5843,0x5cb4
.hword 0x2a62,0x78c8, 0x7556,0x3327, 0x571e,0x5dc8
.hword 0x2827,0x798a, 0x7505,0x33df, 0x55f6,0x5ed7
.hword 0x25e8,0x7a42, 0x74b3,0x3497, 0x54ca,0x5fe4
.hword 0x23a7,0x7aef, 0x7460,0x354e, 0x539b,0x60ec
.hword 0x2162,0x7b92, 0x740b,0x3604, 0x5269,0x61f1
.hword 0x1f1a,0x7c2a, 0x73b6,0x36ba, 0x5134,0x62f2
.hword 0x1cd0,0x7cb7, 0x735f,0x3770, 0x4ffb,0x63ef
.hword 0x1a83,0x7d3a, 0x7308,0x3825, 0x4ec0,0x64e9
.hword 0x1833,0x7db1, 0x72af,0x38d9, 0x4d81,0x65de
.hword 0x15e2,0x7e1e, 0x7255,0x398d, 0x4c40,0x66d0
.hword 0x138f,0x7e7f, 0x71fa,0x3a40, 0x4afb,0x67bd
.hword 0x113a,0x7ed6, 0x719e,0x3af3, 0x49b4,0x68a7
.hword 0x0ee4,0x7f22, 0x7141,0x3ba5, 0x486a,0x698c
.hword 0x0c8c,0x7f62, 0x70e3,0x3c57, 0x471d,0x6a6e
.hword 0x0a33,0x7f98, 0x7083,0x3d08, 0x45cd,0x6b4b
.hword 0x07d9,0x7fc2, 0x7023,0x3db8, 0x447b,0x6c24
.hword 0x057f,0x7fe2, 0x6fc2,0x3e68, 0x4326,0x6cf9
.hword 0x0324,0x7ff6, 0x6f5f,0x3f17, 0x41ce,0x6dca
.hword 0x00c9,0x7fff, 0x6efb,0x3fc6, 0x4074,0x6e97
.hword 0xfe6e,0x7ffe, 0x6e97,0x4074, 0x3f17,0x6f5f
.hword 0xfc13,0x7ff1, 0x6e31,0x4121, 0x3db8,0x7023
.hword 0xf9b8,0x7fd9, 0x6dca,0x41ce, 0x3c57,0x70e3
.hword 0xf75e,0x7fb5, 0x6d62,0x427a, 0x3af3,0x719e
.hword 0xf505,0x7f87, 0x6cf9,0x4326, 0x398d,0x7255
.hword 0xf2ac,0x7f4e, 0x6c8f,0x43d1, 0x3825,0x7308
.hword 0xf055,0x7f0a, 0x6c24,0x447b, 0x36ba,0x73b6
.hword 0xedff,0x7eba, 0x6bb8,0x4524, 0x354e,0x7460
.hword 0xebab,0x7e60, 0x6b4b,0x45cd, 0x33df,0x7505
.hword 0xe958,0x7dfb, 0x6add,0x4675, 0x326e,0x75a6
.hword 0xe707,0x7d8a, 0x6a6e,0x471d, 0x30fc,0x7642
.hword 0xe4b9,0x7d0f, 0x69fd,0x47c4, 0x2f87,0x76d9
.hword 0xe26d,0x7c89, 0x698c,0x486a, 0x2e11,0x776c
.hword 0xe023,0x7bf9, 0x691a,0x490f, 0x2c99,0x77fb
.hword 0xdddc,0x7b5d, 0x68a7,0x49b4, 0x2b1f,0x7885
.hword 0xdb99,0x7ab7, 0x6832,0x4a58, 0x29a4,0x790a
.hword 0xd958,0x7a06, 0x67bd,0x4afb, 0x2827,0x798a
.hword 0xd71b,0x794a, 0x6747,0x4b9e, 0x26a8,0x7a06
.hword 0xd4e1,0x7885, 0x66d0,0x4c40, 0x2528,0x7a7d
.hword 0xd2ab,0x77b4, 0x6657,0x4ce1, 0x23a7,0x7aef
.hword 0xd079,0x76d9, 0x65de,0x4d81, 0x2224,0x7b5d
.hword 0xce4b,0x75f4, 0x6564,0x4e21, 0x209f,0x7bc6
.hword 0xcc21,0x7505, 0x64e9,0x4ec0, 0x1f1a,0x7c2a
.hword 0xc9fc,0x740b, 0x646c,0x4f5e, 0x1d93,0x7c89
.hword 0xc7db,0x7308, 0x63ef,0x4ffb, 0x1c0c,0x7ce4
.hword 0xc5c0,0x71fa, 0x6371,0x5098, 0x1a83,0x7d3a
.hword 0xc3a9,0x70e3, 0x62f2,0x5134, 0x18f9,0x7d8a
.hword 0xc198,0x6fc2, 0x6272,0x51cf, 0x176e,0x7dd6
.hword 0xbf8c,0x6e97, 0x61f1,0x5269, 0x15e2,0x7e1e
.hword 0xbd86,0x6d62, 0x616f,0x5303, 0x1455,0x7e60
.hword 0xbb85,0x6c24, 0x60ec,0x539b, 0x12c8,0x7e9d
.hword 0xb98b,0x6add, 0x6068,0x5433, 0x113a,0x7ed6
.hword 0xb796,0x698c, 0x5fe4,0x54ca, 0x0fab,0x7f0a
.hword 0xb5a8,0x6832, 0x5f5e,0x5560, 0x0e1c,0x7f38
.hword 0xb3c0,0x66d0, 0x5ed7,0x55f6, 0x0c8c,0x7f62
.hword 0xb1df,0x6564, 0x5e50,0x568a, 0x0afb,0x7f87
.hword 0xb005,0x63ef, 0x5dc8,0x571e, 0x096b,0x7fa7
.hword 0xae31,0x6272, 0x5d3e,0x57b1, 0x07d9,0x7fc2
.hword 0xac65,0x60ec, 0x5cb4,0x5843, 0x0648,0x7fd9
.hword 0xaaa0,0x5f5e, 0x5c29,0x58d4, 0x04b6,0x7fea
.hword 0xa8e2,0x5dc8, 0x5b9d,0x5964, 0x0324,0x7ff6
.hword 0xa72c,0x5c29, 0x5b10,0x59f4, 0x0192,0x7ffe
.hword 0xa57e,0x5a82, 0x5a82,0x5a82, 0x0000,0x7fff
.hword 0xa3d7,0x58d4, 0x59f4,0x5b10, 0xfe6e,0x7ffe
.hword 0xa238,0x571e, 0x5964,0x5b9d, 0xfcdc,0x7ff6
.hword 0xa0a2,0x5560, 0x58d4,0x5c29, 0xfb4a,0x7fea
.hword 0x9f14,0x539b, 0x5843,0x5cb4, 0xf9b8,0x7fd9
.hword 0x9d8e,0x51cf, 0x57b1,0x5d3e, 0xf827,0x7fc2
.hword 0x9c11,0x4ffb, 0x571e,0x5dc8, 0xf695,0x7fa7
.hword 0x9a9c,0x4e21, 0x568a,0x5e50, 0xf505,0x7f87
.hword 0x9930,0x4c40, 0x55f6,0x5ed7, 0xf374,0x7f62
.hword 0x97ce,0x4a58, 0x5560,0x5f5e, 0xf1e4,0x7f38
.hword 0x9674,0x486a, 0x54ca,0x5fe4, 0xf055,0x7f0a
.hword 0x9523,0x4675, 0x5433,0x6068, 0xeec6,0x7ed6
.hword 0x93dc,0x447b, 0x539b,0x60ec, 0xed38,0x7e9d
.hword 0x929e,0x427a, 0x5303,0x616f, 0xebab,0x7e60
.hword 0x9169,0x4074, 0x5269,0x61f1, 0xea1e,0x7e1e
.hword 0x903e,0x3e68, 0x51cf,0x6272, 0xe892,0x7dd6
.hword 0x8f1d,0x3c57, 0x5134,0x62f2, 0xe707,0x7d8a
.hword 0x8e06,0x3a40, 0x5098,0x6371, 0xe57d,0x7d3a
.hword 0x8cf8,0x3825, 0x4ffb,0x63ef, 0xe3f4,0x7ce4
.hword 0x8bf5,0x3604, 0x4f5e,0x646c, 0xe26d,0x7c89
.hword 0x8afb,0x33df, 0x4ec0,0x64e9, 0xe0e6,0x7c2a
.hword 0x8a0c,0x31b5, 0x4e21,0x6564, 0xdf61,0x7bc6
.hword 0x8927,0x2f87, 0x4d81,0x65de, 0xdddc,0x7b5d
.hword 0x884c,0x2d55, 0x4ce1,0x6657, 0xdc59,0x7aef
.hword 0x877b,0x2b1f, 0x4c40,0x66d0, 0xdad8,0x7a7d
.hword 0x86b6,0x28e5, 0x4b9e,0x6747, 0xd958,0x7a06
.hword 0x85fa,0x26a8, 0x4afb,0x67bd, 0xd7d9,0x798a
.hword 0x8549,0x2467, 0x4a58,0x6832, 0xd65c,0x790a
.hword 0x84a3,0x2224, 0x49b4,0x68a7, 0xd4e1,0x7885
.hword 0x8407,0x1fdd, 0x490f,0x691a, 0xd367,0x77fb
.hword 0x8377,0x1d93, 0x486a,0x698c, 0xd1ef,0x776c
.hword 0x82f1,0x1b47, 0x47c4,0x69fd, 0xd079,0x76d9
.hword 0x8276,0x18f9, 0x471d,0x6a6e, 0xcf04,0x7642
.hword 0x8205,0x16a8, 0x4675,0x6add, 0xcd92,0x75a6
.hword 0x81a0,0x1455, 0x45cd,0x6b4b, 0xcc21,0x7505
.hword 0x8146,0x1201, 0x4524,0x6bb8, 0xcab2,0x7460
.hword 0x80f6,0x0fab, 0x447b,0x6c24, 0xc946,0x73b6
.hword 0x80b2,0x0d54, 0x43d1,0x6c8f, 0xc7db,0x7308
.hword 0x8079,0x0afb, 0x4326,0x6cf9, 0xc673,0x7255
.hword 0x804b,0x08a2, 0x427a,0x6d62, 0xc50d,0x719e
.hword 0x8027,0x0648, 0x41ce,0x6dca, 0xc3a9,0x70e3
.hword 0x800f,0x03ed, 0x4121,0x6e31, 0xc248,0x7023
.hword 0x8002,0x0192, 0x4074,0x6e97, 0xc0e9,0x6f5f
.hword 0x8001,0xff37, 0x3fc6,0x6efb, 0xbf8c,0x6e97
.hword 0x800a,0xfcdc, 0x3f17,0x6f5f, 0xbe32,0x6dca
.hword 0x801e,0xfa81, 0x3e68,0x6fc2, 0xbcda,0x6cf9
.hword 0x803e,0xf827, 0x3db8,0x7023, 0xbb85,0x6c24
.hword 0x8068,0xf5cd, 0x3d08,0x7083, 0xba33,0x6b4b
.hword 0x809e,0xf374, 0x3c57,0x70e3, 0xb8e3,0x6a6e
.hword 0x80de,0xf11c, 0x3ba5,0x7141, 0xb796,0x698c
.hword 0x812a,0xeec6, 0x3af3,0x719e, 0xb64c,0x68a7
.hword 0x8181,0xec71, 0x3a40,0x71fa, 0xb505,0x67bd
.hword 0x81e2,0xea1e, 0x398d,0x7255, 0xb3c0,0x66d0
.hword 0x824f,0xe7cd, 0x38d9,0x72af, 0xb27f,0x65de
.hword 0x82c6,0xe57d, 0x3825,0x7308, 0xb140,0x64e9
.hword 0x8349,0xe330, 0x3770,0x735f, 0xb005,0x63ef
.hword 0x83d6,0xe0e6, 0x36ba,0x73b6, 0xaecc,0x62f2
.hword 0x846e,0xde9e, 0x3604,0x740b, 0xad97,0x61f1
.hword 0x8511,0xdc59, 0x354e,0x7460, 0xac65,0x60ec
.hword 0x85be,0xda18, 0x3497,0x74b3, 0xab36,0x5fe4
.hword 0x8676,0xd7d9, 0x33df,0x7505, 0xaa0a,0x5ed7
.hword 0x8738,0xd59e, 0x3327,0x7556, 0xa8e2,0x5dc8
.hword 0x8805,0xd367, 0x326e,0x75a6, 0xa7bd,0x5cb4
.hword 0x88dd,0xd134, 0x31b5,0x75f4, 0xa69c,0x5b9d
.hword 0x89be,0xcf04, 0x30fc,0x7642, 0xa57e,0x5a82
.hword 0x8aaa,0xccd9, 0x3042,0x768e, 0xa463,0x5964
.hword 0x8ba0,0xcab2, 0x2f87,0x76d9, 0xa34c,0x5843
.hword 0x8ca1,0xc890, 0x2ecc,0x7723, 0xa238,0x571e
.hword 0x8dab,0xc673, 0x2e11,0x776c, 0xa129,0x55f6
.hword 0x8ebf,0xc45b, 0x2d55,0x77b4, 0xa01c,0x54ca
.hword 0x8fdd,0xc248, 0x2c99,0x77fb, 0x9f14,0x539b
.hword 0x9105,0xc03a, 0x2bdc,0x7840, 0x9e0f,0x5269
.hword 0x9236,0xbe32, 0x2b1f,0x7885, 0x9d0e,0x5134
.hword 0x9371,0xbc2f, 0x2a62,0x78c8, 0x9c11,0x4ffb
.hword 0x94b5,0xba33, 0x29a4,0x790a, 0x9b17,0x4ec0
.hword 0x9603,0xb83c, 0x28e5,0x794a, 0x9a22,0x4d81
.hword 0x9759,0xb64c, 0x2827,0x798a, 0x9930,0x4c40
.hword 0x98b9,0xb462, 0x2768,0x79c9, 0x9843,0x4afb
.hword 0x9a22,0xb27f, 0x26a8,0x7a06, 0x9759,0x49b4
.hword 0x9b94,0xb0a2, 0x25e8,0x7a42, 0x9674,0x486a
.hword 0x9d0e,0xaecc, 0x2528,0x7a7d, 0x9592,0x471d
.hword 0x9e91,0xacfd, 0x2467,0x7ab7, 0x94b5,0x45cd
.hword 0xa01c,0xab36, 0x23a7,0x7aef, 0x93dc,0x447b
.hword 0xa1b0,0xa976, 0x22e5,0x7b27, 0x9307,0x4326
.hword 0xa34c,0xa7bd, 0x2224,0x7b5d, 0x9236,0x41ce
.hword 0xa4f0,0xa60c, 0x2162,0x7b92, 0x9169,0x4074
.hword 0xa69c,0xa463, 0x209f,0x7bc6, 0x90a1,0x3f17
.hword 0xa84f,0xa2c2, 0x1fdd,0x7bf9, 0x8fdd,0x3db8
.hword 0xaa0a,0xa129, 0x1f1a,0x7c2a, 0x8f1d,0x3c57
.hword 0xabcd,0x9f98, 0x1e57,0x7c5a, 0x8e62,0x3af3
.hword 0xad97,0x9e0f, 0x1d93,0x7c89, 0x8dab,0x398d
.hword 0xaf68,0x9c8f, 0x1cd0,0x7cb7, 0x8cf8,0x3825
.hword 0xb140,0x9b17, 0x1c0c,0x7ce4, 0x8c4a,0x36ba
.hword 0xb31f,0x99a9, 0x1b47,0x7d0f, 0x8ba0,0x354e
.hword 0xb505,0x9843, 0x1a83,0x7d3a, 0x8afb,0x33df
.hword 0xb6f1,0x96e6, 0x19be,0x7d63, 0x8a5a,0x326e
.hword 0xb8e3,0x9592, 0x18f9,0x7d8a, 0x89be,0x30fc
.hword 0xbadc,0x9448, 0x1833,0x7db1, 0x8927,0x2f87
.hword 0xbcda,0x9307, 0x176e,0x7dd6, 0x8894,0x2e11
.hword 0xbedf,0x91cf, 0x16a8,0x7dfb, 0x8805,0x2c99
.hword 0xc0e9,0x90a1, 0x15e2,0x7e1e, 0x877b,0x2b1f
.hword 0xc2f8,0x8f7d, 0x151c,0x7e3f, 0x86f6,0x29a4
.hword 0xc50d,0x8e62, 0x1455,0x7e60, 0x8676,0x2827
.hword 0xc727,0x8d51, 0x138f,0x7e7f, 0x85fa,0x26a8
.hword 0xc946,0x8c4a, 0x12c8,0x7e9d, 0x8583,0x2528
.hword 0xcb69,0x8b4d, 0x1201,0x7eba, 0x8511,0x23a7
.hword 0xcd92,0x8a5a, 0x113a,0x7ed6, 0x84a3,0x2224
.hword 0xcfbe,0x8972, 0x1073,0x7ef0, 0x843a,0x209f
.hword 0xd1ef,0x8894, 0x0fab,0x7f0a, 0x83d6,0x1f1a
.hword 0xd424,0x87c0, 0x0ee4,0x7f22, 0x8377,0x1d93
.hword 0xd65c,0x86f6, 0x0e1c,0x7f38, 0x831c,0x1c0c
.hword 0xd898,0x8637, 0x0d54,0x7f4e, 0x82c6,0x1a83
.hword 0xdad8,0x8583, 0x0c8c,0x7f62, 0x8276,0x18f9
.hword 0xdd1b,0x84d9, 0x0bc4,0x7f75, 0x822a,0x176e
.hword 0xdf61,0x843a, 0x0afb,0x7f87, 0x81e2,0x15e2
.hword 0xe1a9,0x83a6, 0x0a33,0x7f98, 0x81a0,0x1455
.hword 0xe3f4,0x831c, 0x096b,0x7fa7, 0x8163,0x12c8
.hword 0xe642,0x829d, 0x08a2,0x7fb5, 0x812a,0x113a
.hword 0xe892,0x822a, 0x07d9,0x7fc2, 0x80f6,0x0fab
.hword 0xeae4,0x81c1, 0x0711,0x7fce, 0x80c8,0x0e1c
.hword 0xed38,0x8163, 0x0648,0x7fd9, 0x809e,0x0c8c
.hword 0xef8d,0x8110, 0x057f,0x7fe2, 0x8079,0x0afb
.hword 0xf1e4,0x80c8, 0x04b6,0x7fea, 0x8059,0x096b
.hword 0xf43c,0x808b, 0x03ed,0x7ff1, 0x803e,0x07d9
.hword 0xf695,0x8059, 0x0324,0x7ff6, 0x8027,0x0648
.hword 0xf8ef,0x8032, 0x025b,0x7ffa, 0x8016,0x04b6
.hword 0xfb4a,0x8016, 0x0192,0x7ffe, 0x800a,0x0324
.hword 0xfda5,0x8006, 0x00c9,0x7fff, 0x8002,0x0192
// N=4096 t=2*PI*k/N for k=0,1,2,..,N/4-1
.hword 0x7fff,0x0000, 0x7fff,0x0000, 0x7fff,0x0000
.hword 0x7fff,0x0097, 0x7fff,0x0032, 0x7fff,0x0065
.hword 0x7fff,0x012e, 0x7fff,0x0065, 0x7fff,0x00c9
.hword 0x7ffd,0x01c4, 0x7fff,0x0097, 0x7fff,0x012e
.hword 0x7ffa,0x025b, 0x7fff,0x00c9, 0x7ffe,0x0192
.hword 0x7ff7,0x02f2, 0x7fff,0x00fb, 0x7ffc,0x01f7
.hword 0x7ff4,0x0389, 0x7fff,0x012e, 0x7ffa,0x025b
.hword 0x7fef,0x041f, 0x7ffe,0x0160, 0x7ff8,0x02c0
.hword 0x7fea,0x04b6, 0x7ffe,0x0192, 0x7ff6,0x0324
.hword 0x7fe4,0x054d, 0x7ffd,0x01c4, 0x7ff4,0x0389
.hword 0x7fdd,0x05e3, 0x7ffc,0x01f7, 0x7ff1,0x03ed
.hword 0x7fd6,0x067a, 0x7ffb,0x0229, 0x7fed,0x0452
.hword 0x7fce,0x0711, 0x7ffa,0x025b, 0x7fea,0x04b6
.hword 0x7fc5,0x07a7, 0x7ff9,0x028d, 0x7fe6,0x051b
.hword 0x7fbc,0x083e, 0x7ff8,0x02c0, 0x7fe2,0x057f
.hword 0x7fb2,0x08d4, 0x7ff7,0x02f2, 0x7fdd,0x05e3
.hword 0x7fa7,0x096b, 0x7ff6,0x0324, 0x7fd9,0x0648
.hword 0x7f9c,0x0a01, 0x7ff5,0x0356, 0x7fd3,0x06ac
.hword 0x7f90,0x0a97, 0x7ff4,0x0389, 0x7fce,0x0711
.hword 0x7f83,0x0b2d, 0x7ff2,0x03bb, 0x7fc8,0x0775
.hword 0x7f75,0x0bc4, 0x7ff1,0x03ed, 0x7fc2,0x07d9
.hword 0x7f67,0x0c5a, 0x7fef,0x041f, 0x7fbc,0x083e
.hword 0x7f58,0x0cf0, 0x7fed,0x0452, 0x7fb5,0x08a2
.hword 0x7f49,0x0d86, 0x7fec,0x0484, 0x7fae,0x0906
.hword 0x7f38,0x0e1c, 0x7fea,0x04b6, 0x7fa7,0x096b
.hword 0x7f27,0x0eb2, 0x7fe8,0x04e8, 0x7fa0,0x09cf
.hword 0x7f16,0x0f47, 0x7fe6,0x051b, 0x7f98,0x0a33
.hword 0x7f03,0x0fdd, 0x7fe4,0x054d, 0x7f90,0x0a97
.hword 0x7ef0,0x1073, 0x7fe2,0x057f, 0x7f87,0x0afb
.hword 0x7edd,0x1108, 0x7fe0,0x05b1, 0x7f7e,0x0b60
.hword 0x7ec8,0x119e, 0x7fdd,0x05e3, 0x7f75,0x0bc4
.hword 0x7eb3,0x1233, 0x7fdb,0x0616, 0x7f6c,0x0c28
.hword 0x7e9d,0x12c8, 0x7fd9,0x0648, 0x7f62,0x0c8c
.hword 0x7e87,0x135d, 0x7fd6,0x067a, 0x7f58,0x0cf0
.hword 0x7e70,0x13f2, 0x7fd3,0x06ac, 0x7f4e,0x0d54
.hword 0x7e58,0x1487, 0x7fd1,0x06de, 0x7f43,0x0db8
.hword 0x7e3f,0x151c, 0x7fce,0x0711, 0x7f38,0x0e1c
.hword 0x7e26,0x15b1, 0x7fcb,0x0743, 0x7f2d,0x0e80
.hword 0x7e0c,0x1645, 0x7fc8,0x0775, 0x7f22,0x0ee4
.hword 0x7df2,0x16da, 0x7fc5,0x07a7, 0x7f16,0x0f47
.hword 0x7dd6,0x176e, 0x7fc2,0x07d9, 0x7f0a,0x0fab
.hword 0x7dba,0x1802, 0x7fbf,0x080c, 0x7efd,0x100f
.hword 0x7d9e,0x1896, 0x7fbc,0x083e, 0x7ef0,0x1073
.hword 0x7d81,0x192a, 0x7fb9,0x0870, 0x7ee3,0x10d6
.hword 0x7d63,0x19be, 0x7fb5,0x08a2, 0x7ed6,0x113a
.hword 0x7d44,0x1a51, 0x7fb2,0x08d4, 0x7ec8,0x119e
.hword 0x7d25,0x1ae5, 0x7fae,0x0906, 0x7eba,0x1201
.hword 0x7d05,0x1b78, 0x7fab,0x0938, 0x7eac,0x1265
.hword 0x7ce4,0x1c0c, 0x7fa7,0x096b, 0x7e9d,0x12c8
.hword 0x7cc2,0x1c9f, 0x7fa3,0x099d, 0x7e8e,0x132b
.hword 0x7ca0,0x1d31, 0x7fa0,0x09cf, 0x7e7f,0x138f
.hword 0x7c7e,0x1dc4, 0x7f9c,0x0a01, 0x7e70,0x13f2
.hword 0x7c5a,0x1e57, 0x7f98,0x0a33, 0x7e60,0x1455
.hword 0x7c36,0x1ee9, 0x7f94,0x0a65, 0x7e50,0x14b9
.hword 0x7c11,0x1f7b, 0x7f90,0x0a97, 0x7e3f,0x151c
.hword 0x7bec,0x200e, 0x7f8b,0x0ac9, 0x7e2f,0x157f
.hword 0x7bc6,0x209f, 0x7f87,0x0afb, 0x7e1e,0x15e2
.hword 0x7b9f,0x2131, 0x7f83,0x0b2d, 0x7e0c,0x1645
.hword 0x7b78,0x21c3, 0x7f7e,0x0b60, 0x7dfb,0x16a8
.hword 0x7b50,0x2254, 0x7f7a,0x0b92, 0x7de9,0x170b
.hword 0x7b27,0x22e5, 0x7f75,0x0bc4, 0x7dd6,0x176e
.hword 0x7afd,0x2376, 0x7f71,0x0bf6, 0x7dc4,0x17d1
.hword 0x7ad3,0x2407, 0x7f6c,0x0c28, 0x7db1,0x1833
.hword 0x7aa8,0x2498, 0x7f67,0x0c5a, 0x7d9e,0x1896
.hword 0x7a7d,0x2528, 0x7f62,0x0c8c, 0x7d8a,0x18f9
.hword 0x7a51,0x25b8, 0x7f5d,0x0cbe, 0x7d77,0x195b
.hword 0x7a24,0x2648, 0x7f58,0x0cf0, 0x7d63,0x19be
.hword 0x79f7,0x26d8, 0x7f53,0x0d22, 0x7d4e,0x1a20
.hword 0x79c9,0x2768, 0x7f4e,0x0d54, 0x7d3a,0x1a83
.hword 0x799a,0x27f7, 0x7f49,0x0d86, 0x7d25,0x1ae5
.hword 0x796a,0x2886, 0x7f43,0x0db8, 0x7d0f,0x1b47
.hword 0x793a,0x2915, 0x7f3e,0x0dea, 0x7cfa,0x1ba9
.hword 0x790a,0x29a4, 0x7f38,0x0e1c, 0x7ce4,0x1c0c
.hword 0x78d8,0x2a32, 0x7f33,0x0e4e, 0x7cce,0x1c6e
.hword 0x78a6,0x2ac1, 0x7f2d,0x0e80, 0x7cb7,0x1cd0
.hword 0x7874,0x2b4f, 0x7f27,0x0eb2, 0x7ca0,0x1d31
.hword 0x7840,0x2bdc, 0x7f22,0x0ee4, 0x7c89,0x1d93
.hword 0x780c,0x2c6a, 0x7f1c,0x0f15, 0x7c72,0x1df5
.hword 0x77d8,0x2cf7, 0x7f16,0x0f47, 0x7c5a,0x1e57
.hword 0x77a2,0x2d84, 0x7f10,0x0f79, 0x7c42,0x1eb8
.hword 0x776c,0x2e11, 0x7f0a,0x0fab, 0x7c2a,0x1f1a
.hword 0x7736,0x2e9e, 0x7f03,0x0fdd, 0x7c11,0x1f7b
.hword 0x76fe,0x2f2a, 0x7efd,0x100f, 0x7bf9,0x1fdd
.hword 0x76c7,0x2fb6, 0x7ef7,0x1041, 0x7bdf,0x203e
.hword 0x768e,0x3042, 0x7ef0,0x1073, 0x7bc6,0x209f
.hword 0x7655,0x30cd, 0x7eea,0x10a4, 0x7bac,0x2101
.hword 0x761b,0x3159, 0x7ee3,0x10d6, 0x7b92,0x2162
.hword 0x75e1,0x31e4, 0x7edd,0x1108, 0x7b78,0x21c3
.hword 0x75a6,0x326e, 0x7ed6,0x113a, 0x7b5d,0x2224
.hword 0x756a,0x32f9, 0x7ecf,0x116c, 0x7b42,0x2284
.hword 0x752d,0x3383, 0x7ec8,0x119e, 0x7b27,0x22e5
.hword 0x74f0,0x340d, 0x7ec1,0x11cf, 0x7b0b,0x2346
.hword 0x74b3,0x3497, 0x7eba,0x1201, 0x7aef,0x23a7
.hword 0x7475,0x3520, 0x7eb3,0x1233, 0x7ad3,0x2407
.hword 0x7436,0x35a9, 0x7eac,0x1265, 0x7ab7,0x2467
.hword 0x73f6,0x3632, 0x7ea5,0x1296, 0x7a9a,0x24c8
.hword 0x73b6,0x36ba, 0x7e9d,0x12c8, 0x7a7d,0x2528
.hword 0x7375,0x3742, 0x7e96,0x12fa, 0x7a60,0x2588
.hword 0x7334,0x37ca, 0x7e8e,0x132b, 0x7a42,0x25e8
.hword 0x72f2,0x3852, 0x7e87,0x135d, 0x7a24,0x2648
.hword 0x72af,0x38d9, 0x7e7f,0x138f, 0x7a06,0x26a8
.hword 0x726c,0x3960, 0x7e78,0x13c1, 0x79e7,0x2708
.hword 0x7228,0x39e7, 0x7e70,0x13f2, 0x79c9,0x2768
.hword 0x71e3,0x3a6d, 0x7e68,0x1424, 0x79aa,0x27c7
.hword 0x719e,0x3af3, 0x7e60,0x1455, 0x798a,0x2827
.hword 0x7158,0x3b79, 0x7e58,0x1487, 0x796a,0x2886
.hword 0x7112,0x3bfe, 0x7e50,0x14b9, 0x794a,0x28e5
.hword 0x70cb,0x3c83, 0x7e48,0x14ea, 0x792a,0x2945
.hword 0x7083,0x3d08, 0x7e3f,0x151c, 0x790a,0x29a4
.hword 0x703b,0x3d8c, 0x7e37,0x154d, 0x78e9,0x2a03
.hword 0x6ff2,0x3e10, 0x7e2f,0x157f, 0x78c8,0x2a62
.hword 0x6fa9,0x3e94, 0x7e26,0x15b1, 0x78a6,0x2ac1
.hword 0x6f5f,0x3f17, 0x7e1e,0x15e2, 0x7885,0x2b1f
.hword 0x6f14,0x3f9a, 0x7e15,0x1614, 0x7863,0x2b7e
.hword 0x6ec9,0x401d, 0x7e0c,0x1645, 0x7840,0x2bdc
.hword 0x6e7d,0x409f, 0x7e03,0x1677, 0x781e,0x2c3b
.hword 0x6e31,0x4121, 0x7dfb,0x16a8, 0x77fb,0x2c99
.hword 0x6de4,0x41a3, 0x7df2,0x16da, 0x77d8,0x2cf7
.hword 0x6d96,0x4224, 0x7de9,0x170b, 0x77b4,0x2d55
.hword 0x6d48,0x42a5, 0x7de0,0x173c, 0x7790,0x2db3
.hword 0x6cf9,0x4326, 0x7dd6,0x176e, 0x776c,0x2e11
.hword 0x6caa,0x43a6, 0x7dcd,0x179f, 0x7748,0x2e6f
.hword 0x6c5a,0x4426, 0x7dc4,0x17d1, 0x7723,0x2ecc
.hword 0x6c09,0x44a5, 0x7dba,0x1802, 0x76fe,0x2f2a
.hword 0x6bb8,0x4524, 0x7db1,0x1833, 0x76d9,0x2f87
.hword 0x6b66,0x45a3, 0x7da7,0x1865, 0x76b4,0x2fe5
.hword 0x6b14,0x4621, 0x7d9e,0x1896, 0x768e,0x3042
.hword 0x6ac1,0x469f, 0x7d94,0x18c7, 0x7668,0x309f
.hword 0x6a6e,0x471d, 0x7d8a,0x18f9, 0x7642,0x30fc
.hword 0x6a1a,0x479a, 0x7d81,0x192a, 0x761b,0x3159
.hword 0x69c5,0x4817, 0x7d77,0x195b, 0x75f4,0x31b5
.hword 0x6970,0x4893, 0x7d6d,0x198d, 0x75cd,0x3212
.hword 0x691a,0x490f, 0x7d63,0x19be, 0x75a6,0x326e
.hword 0x68c4,0x498b, 0x7d58,0x19ef, 0x757e,0x32cb
.hword 0x686d,0x4a06, 0x7d4e,0x1a20, 0x7556,0x3327
.hword 0x6815,0x4a81, 0x7d44,0x1a51, 0x752d,0x3383
.hword 0x67bd,0x4afb, 0x7d3a,0x1a83, 0x7505,0x33df
.hword 0x6764,0x4b75, 0x7d2f,0x1ab4, 0x74dc,0x343b
.hword 0x670b,0x4bef, 0x7d25,0x1ae5, 0x74b3,0x3497
.hword 0x66b2,0x4c68, 0x7d1a,0x1b16, 0x7489,0x34f2
.hword 0x6657,0x4ce1, 0x7d0f,0x1b47, 0x7460,0x354e
.hword 0x65fc,0x4d59, 0x7d05,0x1b78, 0x7436,0x35a9
.hword 0x65a1,0x4dd1, 0x7cfa,0x1ba9, 0x740b,0x3604
.hword 0x6545,0x4e49, 0x7cef,0x1bda, 0x73e1,0x365f
.hword 0x64e9,0x4ec0, 0x7ce4,0x1c0c, 0x73b6,0x36ba
.hword 0x648b,0x4f37, 0x7cd9,0x1c3d, 0x738b,0x3715
.hword 0x642e,0x4fad, 0x7cce,0x1c6e, 0x735f,0x3770
.hword 0x63d0,0x5023, 0x7cc2,0x1c9f, 0x7334,0x37ca
.hword 0x6371,0x5098, 0x7cb7,0x1cd0, 0x7308,0x3825
.hword 0x6312,0x510d, 0x7cac,0x1d01, 0x72dc,0x387f
.hword 0x62b2,0x5181, 0x7ca0,0x1d31, 0x72af,0x38d9
.hword 0x6252,0x51f5, 0x7c95,0x1d62, 0x7282,0x3933
.hword 0x61f1,0x5269, 0x7c89,0x1d93, 0x7255,0x398d
.hword 0x6190,0x52dc, 0x7c7e,0x1dc4, 0x7228,0x39e7
.hword 0x612e,0x534f, 0x7c72,0x1df5, 0x71fa,0x3a40
.hword 0x60cb,0x53c1, 0x7c66,0x1e26, 0x71cc,0x3a9a
.hword 0x6068,0x5433, 0x7c5a,0x1e57, 0x719e,0x3af3
.hword 0x6005,0x54a4, 0x7c4e,0x1e88, 0x7170,0x3b4c
.hword 0x5fa1,0x5515, 0x7c42,0x1eb8, 0x7141,0x3ba5
.hword 0x5f3c,0x5586, 0x7c36,0x1ee9, 0x7112,0x3bfe
.hword 0x5ed7,0x55f6, 0x7c2a,0x1f1a, 0x70e3,0x3c57
.hword 0x5e72,0x5665, 0x7c1e,0x1f4b, 0x70b3,0x3caf
.hword 0x5e0c,0x56d4, 0x7c11,0x1f7b, 0x7083,0x3d08
.hword 0x5da5,0x5743, 0x7c05,0x1fac, 0x7053,0x3d60
.hword 0x5d3e,0x57b1, 0x7bf9,0x1fdd, 0x7023,0x3db8
.hword 0x5cd7,0x581e, 0x7bec,0x200e, 0x6ff2,0x3e10
.hword 0x5c6f,0x588c, 0x7bdf,0x203e, 0x6fc2,0x3e68
.hword 0x5c06,0x58f8, 0x7bd3,0x206f, 0x6f90,0x3ec0
.hword 0x5b9d,0x5964, 0x7bc6,0x209f, 0x6f5f,0x3f17
.hword 0x5b34,0x59d0, 0x7bb9,0x20d0, 0x6f2d,0x3f6f
.hword 0x5ac9,0x5a3b, 0x7bac,0x2101, 0x6efb,0x3fc6
.hword 0x5a5f,0x5aa6, 0x7b9f,0x2131, 0x6ec9,0x401d
.hword 0x59f4,0x5b10, 0x7b92,0x2162, 0x6e97,0x4074
.hword 0x5988,0x5b7a, 0x7b85,0x2192, 0x6e64,0x40cb
.hword 0x591c,0x5be3, 0x7b78,0x21c3, 0x6e31,0x4121
.hword 0x58b0,0x5c4c, 0x7b6a,0x21f3, 0x6dfe,0x4178
.hword 0x5843,0x5cb4, 0x7b5d,0x2224, 0x6dca,0x41ce
.hword 0x57d5,0x5d1c, 0x7b50,0x2254, 0x6d96,0x4224
.hword 0x5767,0x5d83, 0x7b42,0x2284, 0x6d62,0x427a
.hword 0x56f9,0x5dea, 0x7b34,0x22b5, 0x6d2e,0x42d0
.hword 0x568a,0x5e50, 0x7b27,0x22e5, 0x6cf9,0x4326
.hword 0x561b,0x5eb6, 0x7b19,0x2316, 0x6cc4,0x437b
.hword 0x55ab,0x5f1b, 0x7b0b,0x2346, 0x6c8f,0x43d1
.hword 0x553b,0x5f80, 0x7afd,0x2376, 0x6c5a,0x4426
.hword 0x54ca,0x5fe4, 0x7aef,0x23a7, 0x6c24,0x447b
.hword 0x5459,0x6047, 0x7ae1,0x23d7, 0x6bee,0x44d0
.hword 0x53e7,0x60aa, 0x7ad3,0x2407, 0x6bb8,0x4524
.hword 0x5375,0x610d, 0x7ac5,0x2437, 0x6b82,0x4579
.hword 0x5303,0x616f, 0x7ab7,0x2467, 0x6b4b,0x45cd
.hword 0x5290,0x61d1, 0x7aa8,0x2498, 0x6b14,0x4621
.hword 0x521c,0x6232, 0x7a9a,0x24c8, 0x6add,0x4675
.hword 0x51a8,0x6292, 0x7a8c,0x24f8, 0x6aa5,0x46c9
.hword 0x5134,0x62f2, 0x7a7d,0x2528, 0x6a6e,0x471d
.hword 0x50bf,0x6351, 0x7a6e,0x2558, 0x6a36,0x4770
.hword 0x504a,0x63b0, 0x7a60,0x2588, 0x69fd,0x47c4
.hword 0x4fd4,0x640f, 0x7a51,0x25b8, 0x69c5,0x4817
.hword 0x4f5e,0x646c, 0x7a42,0x25e8, 0x698c,0x486a
.hword 0x4ee8,0x64ca, 0x7a33,0x2618, 0x6953,0x48bd
.hword 0x4e71,0x6526, 0x7a24,0x2648, 0x691a,0x490f
.hword 0x4df9,0x6582, 0x7a15,0x2678, 0x68e0,0x4962
.hword 0x4d81,0x65de, 0x7a06,0x26a8, 0x68a7,0x49b4
.hword 0x4d09,0x6639, 0x79f7,0x26d8, 0x686d,0x4a06
.hword 0x4c91,0x6693, 0x79e7,0x2708, 0x6832,0x4a58
.hword 0x4c17,0x66ed, 0x79d8,0x2738, 0x67f8,0x4aaa
.hword 0x4b9e,0x6747, 0x79c9,0x2768, 0x67bd,0x4afb
.hword 0x4b24,0x67a0, 0x79b9,0x2797, 0x6782,0x4b4d
.hword 0x4aaa,0x67f8, 0x79aa,0x27c7, 0x6747,0x4b9e
.hword 0x4a2f,0x6850, 0x799a,0x27f7, 0x670b,0x4bef
.hword 0x49b4,0x68a7, 0x798a,0x2827, 0x66d0,0x4c40
.hword 0x4939,0x68fd, 0x797a,0x2856, 0x6693,0x4c91
.hword 0x48bd,0x6953, 0x796a,0x2886, 0x6657,0x4ce1
.hword 0x4840,0x69a9, 0x795b,0x28b6, 0x661b,0x4d31
.hword 0x47c4,0x69fd, 0x794a,0x28e5, 0x65de,0x4d81
.hword 0x4747,0x6a52, 0x793a,0x2915, 0x65a1,0x4dd1
.hword 0x46c9,0x6aa5, 0x792a,0x2945, 0x6564,0x4e21
.hword 0x464b,0x6af8, 0x791a,0x2974, 0x6526,0x4e71
.hword 0x45cd,0x6b4b, 0x790a,0x29a4, 0x64e9,0x4ec0
.hword 0x454f,0x6b9d, 0x78f9,0x29d3, 0x64ab,0x4f0f
.hword 0x44d0,0x6bee, 0x78e9,0x2a03, 0x646c,0x4f5e
.hword 0x4450,0x6c3f, 0x78d8,0x2a32, 0x642e,0x4fad
.hword 0x43d1,0x6c8f, 0x78c8,0x2a62, 0x63ef,0x4ffb
.hword 0x4351,0x6cdf, 0x78b7,0x2a91, 0x63b0,0x504a
.hword 0x42d0,0x6d2e, 0x78a6,0x2ac1, 0x6371,0x5098
.hword 0x424f,0x6d7c, 0x7895,0x2af0, 0x6332,0x50e6
.hword 0x41ce,0x6dca, 0x7885,0x2b1f, 0x62f2,0x5134
.hword 0x414d,0x6e17, 0x7874,0x2b4f, 0x62b2,0x5181
.hword 0x40cb,0x6e64, 0x7863,0x2b7e, 0x6272,0x51cf
.hword 0x4048,0x6eb0, 0x7851,0x2bad, 0x6232,0x521c
.hword 0x3fc6,0x6efb, 0x7840,0x2bdc, 0x61f1,0x5269
.hword 0x3f43,0x6f46, 0x782f,0x2c0c, 0x61b0,0x52b6
.hword 0x3ec0,0x6f90, 0x781e,0x2c3b, 0x616f,0x5303
.hword 0x3e3c,0x6fda, 0x780c,0x2c6a, 0x612e,0x534f
.hword 0x3db8,0x7023, 0x77fb,0x2c99, 0x60ec,0x539b
.hword 0x3d34,0x706b, 0x77e9,0x2cc8, 0x60aa,0x53e7
.hword 0x3caf,0x70b3, 0x77d8,0x2cf7, 0x6068,0x5433
.hword 0x3c2a,0x70fa, 0x77c6,0x2d26, 0x6026,0x547f
.hword 0x3ba5,0x7141, 0x77b4,0x2d55, 0x5fe4,0x54ca
.hword 0x3b20,0x7187, 0x77a2,0x2d84, 0x5fa1,0x5515
.hword 0x3a9a,0x71cc, 0x7790,0x2db3, 0x5f5e,0x5560
.hword 0x3a13,0x7211, 0x777e,0x2de2, 0x5f1b,0x55ab
.hword 0x398d,0x7255, 0x776c,0x2e11, 0x5ed7,0x55f6
.hword 0x3906,0x7299, 0x775a,0x2e40, 0x5e94,0x5640
.hword 0x387f,0x72dc, 0x7748,0x2e6f, 0x5e50,0x568a
.hword 0x37f7,0x731e, 0x7736,0x2e9e, 0x5e0c,0x56d4
.hword 0x3770,0x735f, 0x7723,0x2ecc, 0x5dc8,0x571e
.hword 0x36e8,0x73a0, 0x7711,0x2efb, 0x5d83,0x5767
.hword 0x365f,0x73e1, 0x76fe,0x2f2a, 0x5d3e,0x57b1
.hword 0x35d7,0x7421, 0x76ec,0x2f59, 0x5cf9,0x57fa
.hword 0x354e,0x7460, 0x76d9,0x2f87, 0x5cb4,0x5843
.hword 0x34c4,0x749e, 0x76c7,0x2fb6, 0x5c6f,0x588c
.hword 0x343b,0x74dc, 0x76b4,0x2fe5, 0x5c29,0x58d4
.hword 0x33b1,0x7519, 0x76a1,0x3013, 0x5be3,0x591c
.hword 0x3327,0x7556, 0x768e,0x3042, 0x5b9d,0x5964
.hword 0x329d,0x7592, 0x767b,0x3070, 0x5b57,0x59ac
.hword 0x3212,0x75cd, 0x7668,0x309f, 0x5b10,0x59f4
.hword 0x3187,0x7608, 0x7655,0x30cd, 0x5ac9,0x5a3b
.hword 0x30fc,0x7642, 0x7642,0x30fc, 0x5a82,0x5a82
.hword 0x3070,0x767b, 0x762e,0x312a, 0x5a3b,0x5ac9
.hword 0x2fe5,0x76b4, 0x761b,0x3159, 0x59f4,0x5b10
.hword 0x2f59,0x76ec, 0x7608,0x3187, 0x59ac,0x5b57
.hword 0x2ecc,0x7723, 0x75f4,0x31b5, 0x5964,0x5b9d
.hword 0x2e40,0x775a, 0x75e1,0x31e4, 0x591c,0x5be3
.hword 0x2db3,0x7790, 0x75cd,0x3212, 0x58d4,0x5c29
.hword 0x2d26,0x77c6, 0x75b9,0x3240, 0x588c,0x5c6f
.hword 0x2c99,0x77fb, 0x75a6,0x326e, 0x5843,0x5cb4
.hword 0x2c0c,0x782f, 0x7592,0x329d, 0x57fa,0x5cf9
.hword 0x2b7e,0x7863, 0x757e,0x32cb, 0x57b1,0x5d3e
.hword 0x2af0,0x7895, 0x756a,0x32f9, 0x5767,0x5d83
.hword 0x2a62,0x78c8, 0x7556,0x3327, 0x571e,0x5dc8
.hword 0x29d3,0x78f9, 0x7542,0x3355, 0x56d4,0x5e0c
.hword 0x2945,0x792a, 0x752d,0x3383, 0x568a,0x5e50
.hword 0x28b6,0x795b, 0x7519,0x33b1, 0x5640,0x5e94
.hword 0x2827,0x798a, 0x7505,0x33df, 0x55f6,0x5ed7
.hword 0x2797,0x79b9, 0x74f0,0x340d, 0x55ab,0x5f1b
.hword 0x2708,0x79e7, 0x74dc,0x343b, 0x5560,0x5f5e
.hword 0x2678,0x7a15, 0x74c7,0x3469, 0x5515,0x5fa1
.hword 0x25e8,0x7a42, 0x74b3,0x3497, 0x54ca,0x5fe4
.hword 0x2558,0x7a6e, 0x749e,0x34c4, 0x547f,0x6026
.hword 0x24c8,0x7a9a, 0x7489,0x34f2, 0x5433,0x6068
.hword 0x2437,0x7ac5, 0x7475,0x3520, 0x53e7,0x60aa
.hword 0x23a7,0x7aef, 0x7460,0x354e, 0x539b,0x60ec
.hword 0x2316,0x7b19, 0x744b,0x357b, 0x534f,0x612e
.hword 0x2284,0x7b42, 0x7436,0x35a9, 0x5303,0x616f
.hword 0x21f3,0x7b6a, 0x7421,0x35d7, 0x52b6,0x61b0
.hword 0x2162,0x7b92, 0x740b,0x3604, 0x5269,0x61f1
.hword 0x20d0,0x7bb9, 0x73f6,0x3632, 0x521c,0x6232
.hword 0x203e,0x7bdf, 0x73e1,0x365f, 0x51cf,0x6272
.hword 0x1fac,0x7c05, 0x73cb,0x368d, 0x5181,0x62b2
.hword 0x1f1a,0x7c2a, 0x73b6,0x36ba, 0x5134,0x62f2
.hword 0x1e88,0x7c4e, 0x73a0,0x36e8, 0x50e6,0x6332
.hword 0x1df5,0x7c72, 0x738b,0x3715, 0x5098,0x6371
.hword 0x1d62,0x7c95, 0x7375,0x3742, 0x504a,0x63b0
.hword 0x1cd0,0x7cb7, 0x735f,0x3770, 0x4ffb,0x63ef
.hword 0x1c3d,0x7cd9, 0x734a,0x379d, 0x4fad,0x642e
.hword 0x1ba9,0x7cfa, 0x7334,0x37ca, 0x4f5e,0x646c
.hword 0x1b16,0x7d1a, 0x731e,0x37f7, 0x4f0f,0x64ab
.hword 0x1a83,0x7d3a, 0x7308,0x3825, 0x4ec0,0x64e9
.hword 0x19ef,0x7d58, 0x72f2,0x3852, 0x4e71,0x6526
.hword 0x195b,0x7d77, 0x72dc,0x387f, 0x4e21,0x6564
.hword 0x18c7,0x7d94, 0x72c5,0x38ac, 0x4dd1,0x65a1
.hword 0x1833,0x7db1, 0x72af,0x38d9, 0x4d81,0x65de
.hword 0x179f,0x7dcd, 0x7299,0x3906, 0x4d31,0x661b
.hword 0x170b,0x7de9, 0x7282,0x3933, 0x4ce1,0x6657
.hword 0x1677,0x7e03, 0x726c,0x3960, 0x4c91,0x6693
.hword 0x15e2,0x7e1e, 0x7255,0x398d, 0x4c40,0x66d0
.hword 0x154d,0x7e37, 0x723f,0x39ba, 0x4bef,0x670b
.hword 0x14b9,0x7e50, 0x7228,0x39e7, 0x4b9e,0x6747
.hword 0x1424,0x7e68, 0x7211,0x3a13, 0x4b4d,0x6782
.hword 0x138f,0x7e7f, 0x71fa,0x3a40, 0x4afb,0x67bd
.hword 0x12fa,0x7e96, 0x71e3,0x3a6d, 0x4aaa,0x67f8
.hword 0x1265,0x7eac, 0x71cc,0x3a9a, 0x4a58,0x6832
.hword 0x11cf,0x7ec1, 0x71b5,0x3ac6, 0x4a06,0x686d
.hword 0x113a,0x7ed6, 0x719e,0x3af3, 0x49b4,0x68a7
.hword 0x10a4,0x7eea, 0x7187,0x3b20, 0x4962,0x68e0
.hword 0x100f,0x7efd, 0x7170,0x3b4c, 0x490f,0x691a
.hword 0x0f79,0x7f10, 0x7158,0x3b79, 0x48bd,0x6953
.hword 0x0ee4,0x7f22, 0x7141,0x3ba5, 0x486a,0x698c
.hword 0x0e4e,0x7f33, 0x712a,0x3bd2, 0x4817,0x69c5
.hword 0x0db8,0x7f43, 0x7112,0x3bfe, 0x47c4,0x69fd
.hword 0x0d22,0x7f53, 0x70fa,0x3c2a, 0x4770,0x6a36
.hword 0x0c8c,0x7f62, 0x70e3,0x3c57, 0x471d,0x6a6e
.hword 0x0bf6,0x7f71, 0x70cb,0x3c83, 0x46c9,0x6aa5
.hword 0x0b60,0x7f7e, 0x70b3,0x3caf, 0x4675,0x6add
.hword 0x0ac9,0x7f8b, 0x709b,0x3cdc, 0x4621,0x6b14
.hword 0x0a33,0x7f98, 0x7083,0x3d08, 0x45cd,0x6b4b
.hword 0x099d,0x7fa3, 0x706b,0x3d34, 0x4579,0x6b82
.hword 0x0906,0x7fae, 0x7053,0x3d60, 0x4524,0x6bb8
.hword 0x0870,0x7fb9, 0x703b,0x3d8c, 0x44d0,0x6bee
.hword 0x07d9,0x7fc2, 0x7023,0x3db8, 0x447b,0x6c24
.hword 0x0743,0x7fcb, 0x700b,0x3de4, 0x4426,0x6c5a
.hword 0x06ac,0x7fd3, 0x6ff2,0x3e10, 0x43d1,0x6c8f
.hword 0x0616,0x7fdb, 0x6fda,0x3e3c, 0x437b,0x6cc4
.hword 0x057f,0x7fe2, 0x6fc2,0x3e68, 0x4326,0x6cf9
.hword 0x04e8,0x7fe8, 0x6fa9,0x3e94, 0x42d0,0x6d2e
.hword 0x0452,0x7fed, 0x6f90,0x3ec0, 0x427a,0x6d62
.hword 0x03bb,0x7ff2, 0x6f78,0x3eec, 0x4224,0x6d96
.hword 0x0324,0x7ff6, 0x6f5f,0x3f17, 0x41ce,0x6dca
.hword 0x028d,0x7ff9, 0x6f46,0x3f43, 0x4178,0x6dfe
.hword 0x01f7,0x7ffc, 0x6f2d,0x3f6f, 0x4121,0x6e31
.hword 0x0160,0x7ffe, 0x6f14,0x3f9a, 0x40cb,0x6e64
.hword 0x00c9,0x7fff, 0x6efb,0x3fc6, 0x4074,0x6e97
.hword 0x0032,0x7fff, 0x6ee2,0x3ff1, 0x401d,0x6ec9
.hword 0xff9b,0x7fff, 0x6ec9,0x401d, 0x3fc6,0x6efb
.hword 0xff05,0x7fff, 0x6eb0,0x4048, 0x3f6f,0x6f2d
.hword 0xfe6e,0x7ffe, 0x6e97,0x4074, 0x3f17,0x6f5f
.hword 0xfdd7,0x7ffb, 0x6e7d,0x409f, 0x3ec0,0x6f90
.hword 0xfd40,0x7ff8, 0x6e64,0x40cb, 0x3e68,0x6fc2
.hword 0xfcaa,0x7ff5, 0x6e4a,0x40f6, 0x3e10,0x6ff2
.hword 0xfc13,0x7ff1, 0x6e31,0x4121, 0x3db8,0x7023
.hword 0xfb7c,0x7fec, 0x6e17,0x414d, 0x3d60,0x7053
.hword 0xfae5,0x7fe6, 0x6dfe,0x4178, 0x3d08,0x7083
.hword 0xfa4f,0x7fe0, 0x6de4,0x41a3, 0x3caf,0x70b3
.hword 0xf9b8,0x7fd9, 0x6dca,0x41ce, 0x3c57,0x70e3
.hword 0xf922,0x7fd1, 0x6db0,0x41f9, 0x3bfe,0x7112
.hword 0xf88b,0x7fc8, 0x6d96,0x4224, 0x3ba5,0x7141
.hword 0xf7f4,0x7fbf, 0x6d7c,0x424f, 0x3b4c,0x7170
.hword 0xf75e,0x7fb5, 0x6d62,0x427a, 0x3af3,0x719e
.hword 0xf6c8,0x7fab, 0x6d48,0x42a5, 0x3a9a,0x71cc
.hword 0xf631,0x7fa0, 0x6d2e,0x42d0, 0x3a40,0x71fa
.hword 0xf59b,0x7f94, 0x6d14,0x42fb, 0x39e7,0x7228
.hword 0xf505,0x7f87, 0x6cf9,0x4326, 0x398d,0x7255
.hword 0xf46e,0x7f7a, 0x6cdf,0x4351, 0x3933,0x7282
.hword 0xf3d8,0x7f6c, 0x6cc4,0x437b, 0x38d9,0x72af
.hword 0xf342,0x7f5d, 0x6caa,0x43a6, 0x387f,0x72dc
.hword 0xf2ac,0x7f4e, 0x6c8f,0x43d1, 0x3825,0x7308
.hword 0xf216,0x7f3e, 0x6c75,0x43fb, 0x37ca,0x7334
.hword 0xf180,0x7f2d, 0x6c5a,0x4426, 0x3770,0x735f
.hword 0xf0eb,0x7f1c, 0x6c3f,0x4450, 0x3715,0x738b
.hword 0xf055,0x7f0a, 0x6c24,0x447b, 0x36ba,0x73b6
.hword 0xefbf,0x7ef7, 0x6c09,0x44a5, 0x365f,0x73e1
.hword 0xef2a,0x7ee3, 0x6bee,0x44d0, 0x3604,0x740b
.hword 0xee94,0x7ecf, 0x6bd3,0x44fa, 0x35a9,0x7436
.hword 0xedff,0x7eba, 0x6bb8,0x4524, 0x354e,0x7460
.hword 0xed6a,0x7ea5, 0x6b9d,0x454f, 0x34f2,0x7489
.hword 0xecd5,0x7e8e, 0x6b82,0x4579, 0x3497,0x74b3
.hword 0xec3f,0x7e78, 0x6b66,0x45a3, 0x343b,0x74dc
.hword 0xebab,0x7e60, 0x6b4b,0x45cd, 0x33df,0x7505
.hword 0xeb16,0x7e48, 0x6b30,0x45f7, 0x3383,0x752d
.hword 0xea81,0x7e2f, 0x6b14,0x4621, 0x3327,0x7556
.hword 0xe9ec,0x7e15, 0x6af8,0x464b, 0x32cb,0x757e
.hword 0xe958,0x7dfb, 0x6add,0x4675, 0x326e,0x75a6
.hword 0xe8c4,0x7de0, 0x6ac1,0x469f, 0x3212,0x75cd
.hword 0xe82f,0x7dc4, 0x6aa5,0x46c9, 0x31b5,0x75f4
.hword 0xe79b,0x7da7, 0x6a89,0x46f3, 0x3159,0x761b
.hword 0xe707,0x7d8a, 0x6a6e,0x471d, 0x30fc,0x7642
.hword 0xe673,0x7d6d, 0x6a52,0x4747, 0x309f,0x7668
.hword 0xe5e0,0x7d4e, 0x6a36,0x4770, 0x3042,0x768e
.hword 0xe54c,0x7d2f, 0x6a1a,0x479a, 0x2fe5,0x76b4
.hword 0xe4b9,0x7d0f, 0x69fd,0x47c4, 0x2f87,0x76d9
.hword 0xe426,0x7cef, 0x69e1,0x47ed, 0x2f2a,0x76fe
.hword 0xe392,0x7cce, 0x69c5,0x4817, 0x2ecc,0x7723
.hword 0xe2ff,0x7cac, 0x69a9,0x4840, 0x2e6f,0x7748
.hword 0xe26d,0x7c89, 0x698c,0x486a, 0x2e11,0x776c
.hword 0xe1da,0x7c66, 0x6970,0x4893, 0x2db3,0x7790
.hword 0xe148,0x7c42, 0x6953,0x48bd, 0x2d55,0x77b4
.hword 0xe0b5,0x7c1e, 0x6937,0x48e6, 0x2cf7,0x77d8
.hword 0xe023,0x7bf9, 0x691a,0x490f, 0x2c99,0x77fb
.hword 0xdf91,0x7bd3, 0x68fd,0x4939, 0x2c3b,0x781e
.hword 0xdeff,0x7bac, 0x68e0,0x4962, 0x2bdc,0x7840
.hword 0xde6e,0x7b85, 0x68c4,0x498b, 0x2b7e,0x7863
.hword 0xdddc,0x7b5d, 0x68a7,0x49b4, 0x2b1f,0x7885
.hword 0xdd4b,0x7b34, 0x688a,0x49dd, 0x2ac1,0x78a6
.hword 0xdcba,0x7b0b, 0x686d,0x4a06, 0x2a62,0x78c8
.hword 0xdc29,0x7ae1, 0x6850,0x4a2f, 0x2a03,0x78e9
.hword 0xdb99,0x7ab7, 0x6832,0x4a58, 0x29a4,0x790a
.hword 0xdb08,0x7a8c, 0x6815,0x4a81, 0x2945,0x792a
.hword 0xda78,0x7a60, 0x67f8,0x4aaa, 0x28e5,0x794a
.hword 0xd9e8,0x7a33, 0x67da,0x4ad3, 0x2886,0x796a
.hword 0xd958,0x7a06, 0x67bd,0x4afb, 0x2827,0x798a
.hword 0xd8c8,0x79d8, 0x67a0,0x4b24, 0x27c7,0x79aa
.hword 0xd839,0x79aa, 0x6782,0x4b4d, 0x2768,0x79c9
.hword 0xd7aa,0x797a, 0x6764,0x4b75, 0x2708,0x79e7
.hword 0xd71b,0x794a, 0x6747,0x4b9e, 0x26a8,0x7a06
.hword 0xd68c,0x791a, 0x6729,0x4bc7, 0x2648,0x7a24
.hword 0xd5fd,0x78e9, 0x670b,0x4bef, 0x25e8,0x7a42
.hword 0xd56f,0x78b7, 0x66ed,0x4c17, 0x2588,0x7a60
.hword 0xd4e1,0x7885, 0x66d0,0x4c40, 0x2528,0x7a7d
.hword 0xd453,0x7851, 0x66b2,0x4c68, 0x24c8,0x7a9a
.hword 0xd3c5,0x781e, 0x6693,0x4c91, 0x2467,0x7ab7
.hword 0xd338,0x77e9, 0x6675,0x4cb9, 0x2407,0x7ad3
.hword 0xd2ab,0x77b4, 0x6657,0x4ce1, 0x23a7,0x7aef
.hword 0xd21e,0x777e, 0x6639,0x4d09, 0x2346,0x7b0b
.hword 0xd191,0x7748, 0x661b,0x4d31, 0x22e5,0x7b27
.hword 0xd105,0x7711, 0x65fc,0x4d59, 0x2284,0x7b42
.hword 0xd079,0x76d9, 0x65de,0x4d81, 0x2224,0x7b5d
.hword 0xcfed,0x76a1, 0x65c0,0x4da9, 0x21c3,0x7b78
.hword 0xcf61,0x7668, 0x65a1,0x4dd1, 0x2162,0x7b92
.hword 0xced6,0x762e, 0x6582,0x4df9, 0x2101,0x7bac
.hword 0xce4b,0x75f4, 0x6564,0x4e21, 0x209f,0x7bc6
.hword 0xcdc0,0x75b9, 0x6545,0x4e49, 0x203e,0x7bdf
.hword 0xcd35,0x757e, 0x6526,0x4e71, 0x1fdd,0x7bf9
.hword 0xccab,0x7542, 0x6507,0x4e98, 0x1f7b,0x7c11
.hword 0xcc21,0x7505, 0x64e9,0x4ec0, 0x1f1a,0x7c2a
.hword 0xcb97,0x74c7, 0x64ca,0x4ee8, 0x1eb8,0x7c42
.hword 0xcb0e,0x7489, 0x64ab,0x4f0f, 0x1e57,0x7c5a
.hword 0xca85,0x744b, 0x648b,0x4f37, 0x1df5,0x7c72
.hword 0xc9fc,0x740b, 0x646c,0x4f5e, 0x1d93,0x7c89
.hword 0xc973,0x73cb, 0x644d,0x4f85, 0x1d31,0x7ca0
.hword 0xc8eb,0x738b, 0x642e,0x4fad, 0x1cd0,0x7cb7
.hword 0xc863,0x734a, 0x640f,0x4fd4, 0x1c6e,0x7cce
.hword 0xc7db,0x7308, 0x63ef,0x4ffb, 0x1c0c,0x7ce4
.hword 0xc754,0x72c5, 0x63d0,0x5023, 0x1ba9,0x7cfa
.hword 0xc6cd,0x7282, 0x63b0,0x504a, 0x1b47,0x7d0f
.hword 0xc646,0x723f, 0x6391,0x5071, 0x1ae5,0x7d25
.hword 0xc5c0,0x71fa, 0x6371,0x5098, 0x1a83,0x7d3a
.hword 0xc53a,0x71b5, 0x6351,0x50bf, 0x1a20,0x7d4e
.hword 0xc4b4,0x7170, 0x6332,0x50e6, 0x19be,0x7d63
.hword 0xc42e,0x712a, 0x6312,0x510d, 0x195b,0x7d77
.hword 0xc3a9,0x70e3, 0x62f2,0x5134, 0x18f9,0x7d8a
.hword 0xc324,0x709b, 0x62d2,0x515b, 0x1896,0x7d9e
.hword 0xc2a0,0x7053, 0x62b2,0x5181, 0x1833,0x7db1
.hword 0xc21c,0x700b, 0x6292,0x51a8, 0x17d1,0x7dc4
.hword 0xc198,0x6fc2, 0x6272,0x51cf, 0x176e,0x7dd6
.hword 0xc114,0x6f78, 0x6252,0x51f5, 0x170b,0x7de9
.hword 0xc091,0x6f2d, 0x6232,0x521c, 0x16a8,0x7dfb
.hword 0xc00f,0x6ee2, 0x6211,0x5243, 0x1645,0x7e0c
.hword 0xbf8c,0x6e97, 0x61f1,0x5269, 0x15e2,0x7e1e
.hword 0xbf0a,0x6e4a, 0x61d1,0x5290, 0x157f,0x7e2f
.hword 0xbe88,0x6dfe, 0x61b0,0x52b6, 0x151c,0x7e3f
.hword 0xbe07,0x6db0, 0x6190,0x52dc, 0x14b9,0x7e50
.hword 0xbd86,0x6d62, 0x616f,0x5303, 0x1455,0x7e60
.hword 0xbd05,0x6d14, 0x614e,0x5329, 0x13f2,0x7e70
.hword 0xbc85,0x6cc4, 0x612e,0x534f, 0x138f,0x7e7f
.hword 0xbc05,0x6c75, 0x610d,0x5375, 0x132b,0x7e8e
.hword 0xbb85,0x6c24, 0x60ec,0x539b, 0x12c8,0x7e9d
.hword 0xbb06,0x6bd3, 0x60cb,0x53c1, 0x1265,0x7eac
.hword 0xba87,0x6b82, 0x60aa,0x53e7, 0x1201,0x7eba
.hword 0xba09,0x6b30, 0x6089,0x540d, 0x119e,0x7ec8
.hword 0xb98b,0x6add, 0x6068,0x5433, 0x113a,0x7ed6
.hword 0xb90d,0x6a89, 0x6047,0x5459, 0x10d6,0x7ee3
.hword 0xb890,0x6a36, 0x6026,0x547f, 0x1073,0x7ef0
.hword 0xb813,0x69e1, 0x6005,0x54a4, 0x100f,0x7efd
.hword 0xb796,0x698c, 0x5fe4,0x54ca, 0x0fab,0x7f0a
.hword 0xb71a,0x6937, 0x5fc2,0x54f0, 0x0f47,0x7f16
.hword 0xb69e,0x68e0, 0x5fa1,0x5515, 0x0ee4,0x7f22
.hword 0xb623,0x688a, 0x5f80,0x553b, 0x0e80,0x7f2d
.hword 0xb5a8,0x6832, 0x5f5e,0x5560, 0x0e1c,0x7f38
.hword 0xb52d,0x67da, 0x5f3c,0x5586, 0x0db8,0x7f43
.hword 0xb4b3,0x6782, 0x5f1b,0x55ab, 0x0d54,0x7f4e
.hword 0xb439,0x6729, 0x5ef9,0x55d0, 0x0cf0,0x7f58
.hword 0xb3c0,0x66d0, 0x5ed7,0x55f6, 0x0c8c,0x7f62
.hword 0xb347,0x6675, 0x5eb6,0x561b, 0x0c28,0x7f6c
.hword 0xb2cf,0x661b, 0x5e94,0x5640, 0x0bc4,0x7f75
.hword 0xb257,0x65c0, 0x5e72,0x5665, 0x0b60,0x7f7e
.hword 0xb1df,0x6564, 0x5e50,0x568a, 0x0afb,0x7f87
.hword 0xb168,0x6507, 0x5e2e,0x56af, 0x0a97,0x7f90
.hword 0xb0f1,0x64ab, 0x5e0c,0x56d4, 0x0a33,0x7f98
.hword 0xb07b,0x644d, 0x5dea,0x56f9, 0x09cf,0x7fa0
.hword 0xb005,0x63ef, 0x5dc8,0x571e, 0x096b,0x7fa7
.hword 0xaf8f,0x6391, 0x5da5,0x5743, 0x0906,0x7fae
.hword 0xaf1a,0x6332, 0x5d83,0x5767, 0x08a2,0x7fb5
.hword 0xaea5,0x62d2, 0x5d61,0x578c, 0x083e,0x7fbc
.hword 0xae31,0x6272, 0x5d3e,0x57b1, 0x07d9,0x7fc2
.hword 0xadbd,0x6211, 0x5d1c,0x57d5, 0x0775,0x7fc8
.hword 0xad4a,0x61b0, 0x5cf9,0x57fa, 0x0711,0x7fce
.hword 0xacd7,0x614e, 0x5cd7,0x581e, 0x06ac,0x7fd3
.hword 0xac65,0x60ec, 0x5cb4,0x5843, 0x0648,0x7fd9
.hword 0xabf3,0x6089, 0x5c91,0x5867, 0x05e3,0x7fdd
.hword 0xab81,0x6026, 0x5c6f,0x588c, 0x057f,0x7fe2
.hword 0xab10,0x5fc2, 0x5c4c,0x58b0, 0x051b,0x7fe6
.hword 0xaaa0,0x5f5e, 0x5c29,0x58d4, 0x04b6,0x7fea
.hword 0xaa30,0x5ef9, 0x5c06,0x58f8, 0x0452,0x7fed
.hword 0xa9c0,0x5e94, 0x5be3,0x591c, 0x03ed,0x7ff1
.hword 0xa951,0x5e2e, 0x5bc0,0x5940, 0x0389,0x7ff4
.hword 0xa8e2,0x5dc8, 0x5b9d,0x5964, 0x0324,0x7ff6
.hword 0xa874,0x5d61, 0x5b7a,0x5988, 0x02c0,0x7ff8
.hword 0xa806,0x5cf9, 0x5b57,0x59ac, 0x025b,0x7ffa
.hword 0xa799,0x5c91, 0x5b34,0x59d0, 0x01f7,0x7ffc
.hword 0xa72c,0x5c29, 0x5b10,0x59f4, 0x0192,0x7ffe
.hword 0xa6c0,0x5bc0, 0x5aed,0x5a18, 0x012e,0x7fff


Pito
Wed Jun 15, 2016 6:48 am
For example the standard ARM’s CMSIS Cortex M3 DSP lib includes everything you need for fft/ifft

CMSIS-DSP: DSP Library Collection with over 60 Functions for various data types: fix-point (fractional q7, q15, q31) and single precision floating-point (32-bit). The library is available for Cortex-M0, Cortex-M3, and Cortex-M4. The Cortex-M4 implementation is optimized for the SIMD instruction set.

You need to apply q15 fft/ifft.

Here it works with Teensy, so it must work with stm32duino too

https://forum.pjrc.com/threads/24228-Te … -questions


RogerClark
Wed Jun 15, 2016 6:53 am
Where can these libs be downloaded from ?

I did a search on “ARM CMSIS Cortex M3 DSP lib” but can’t find any downloadable code.


Pito
Wed Jun 15, 2016 6:54 am
Teensy_duino works with it, so just grab it from there

https://forum.pjrc.com/threads/24228-Te … -questions


RogerClark
Wed Jun 15, 2016 6:55 am
Thanks

I also found some code here

https://github.com/ARM-software/CMSIS/t … IS/DSP_Lib


Pito
Wed Jun 15, 2016 7:00 am
here it is

https://github.com/ARM-software/CMSIS/tree/master/CMSIS

and the dozens of fft ifft functions

https://github.com/ARM-software/CMSIS/t … mFunctions

Use q15 one..


RogerClark
Wed Jun 15, 2016 9:32 pm
@pitp

I can get the CMSIS fft q15 to compile, but at the moment the code never returns from the fft function.

I dont think its crashed, as the board still resets via USB.

I need to find an example of using this q15 function, as I am not sure whether any “init” functions are needed prior to calling it. As I know some other fft arm functions require initialisation funcs to be called first.

I found what looked like a q15 init func, but it just crashes the MCU, so I think I have an issue with data types.

Actually, what I find more interesting, is how easy it is to pull in these ARM CMSIS code libraries.

I only had to being in 7 headers and 2 C files.

So as the ARM CMSIS libs have loads of other functions, I think there is a reasonable chance someone else may find them handy.

not just FFT, there are loads of other funcs ( as I am sure you are well aware)


Leave a Reply

Your email address will not be published. Required fields are marked *