Hi ADI folks,
I previously posted a discussion (https://ez.analog.com/message/212210#212210) that I had to find a solution for. When different FIR filters were in use, there were different input signal IQ levels that would cause digital distortion in the TX signal chain (observable in a test setup where I can chirp a tone from the negative Nyquist frequency to the positive Nyquist frequency at any one selected sample rate.) The distortion was observable spectrally and by reading the CH1 Overflow register.
I need a standardized input signal IQ range to target. The hope is for max. 12-bit IQ (for max. dynamic range/SNR). In an effort to make this possible, I have altered internal_design_filter.m in ad936x-filter-wizard to scale the FIR coefficients differently than the method employed from the repository.
I have attached a patch for my changes and was hoping that you folks would be able to review and comment on the code or its output products. In particular, I have no knowledge of the inner workings of the 9361 FIR filter and its accumulator stages, so I have been stabbing in the dark for the possible bit widths of these accumulator stages and assuming the most-significant 16 bits are taken as the FIR output.
The scaling performed isn't the friendliest to some of the designed filter characteristics (particularly it seems to change the stop band). However, it has worked pretty well for the couple FIR filters I've designed so far for our use. I can achieve higher transceiver output power with 12-bit IQ signal input without digital distortion and preserving mostly the same filter response.
A problem I have run into is this method hasn't worked for all the filters I've tried. In particular, I tried this code with the LTE5/20 filters in the ad9361_settings.mat and the FIR output responses are far higher than I would expect (resulting in overflow in TFIR or some of the following filters). I've considered the difference in the number of taps (96 taps versus my 128 tap filters), but I do not understand why the "LTE" filters do not work with my method.