That is very curious! Are you using the "VOICE_RECOGNITION" mic stream? I'm wondering if there is some sort of odd DSP filtering being applied in the firmware.
On Tue, Feb 9, 2016 at 8:59 AM, 'RLScott' via Android Developers < [email protected]> wrote: > OK, I finally got myself a cheap LG G3 from eBay and did some testing. > The situation is not exactly as I described before. Here is what is really > happening. I tested my app with a sine-wave tone generator. > > When the tone generator is below about 3700 Hz, the spectrum displayed in > my app shows just one peak at the desired frequency. As the frequency of > the tone generator increases toward 4000 Hz, a very tiny mirror image peak > begins to appear on the other side of 4000 Hz. It gradually gains in > amplitude until by 3958 Hz, the amplitude of the image peak is actually a > bit higher than the peak at the correct frequency. As the tone goes above > 4000 Hz, the image peak appears below 4000 Hz, and gradually decreases in > amplitude as the tone frequency increases. I ran the tone frequency up to > 4698 Hz and saw a single peak at 4698 Hz in the spectrum and no image > peak. This entirely destroys my supposition that this phone is initially > sampling at 8000 Hz and then up-sampling to 44100, because if it were, > there would be no way to show a single peak at 4698 Hz with no image peak, > right? I mean, the information that discriminates between 4698 and 3302 is > totally destroyed if the audio is initially sampled at 8000 Hz. > > But something is going on in the phone's audio system that introduces this > image around 4000 Hz. Could it be some sort of hetrodyning? I know in > single sideband radio there are ways to invert the audio spectrum if the > detection carrier is set on the wrong side of the signal. But why would > things return to normal for tones well away from 4000 Hz? > > -Robert Scott > Hopkins, MN > > > On Tuesday, February 2, 2016 at 12:41:32 PM UTC-6, Julian Bunn wrote: >> >> Perhaps you can post your code, and we can take a look to see if we see >> anything that might be causing this problem? Otherwise, if it really is a >> firmware "feature" in those two devices, I don't see any good alternatives >> other than a) marking your APK as incompatible with those devices in Google >> Play, or b) doing some DSP in your software to detect the condition and >> work around it somehow. If it were me, I would obtain a G3 and start >> testing ... >> >> >> >> On Tue, Feb 2, 2016 at 6:08 AM, 'RLScott' via Android Developers < >> [email protected]> wrote: >> >>> The theory says if the initial hardware sampling is done at 8000 samples >>> per second, the aliasing is already "frozen" into the sampled data. You can >>> see that by observing that 4100 Hz and 3900 Hz look exactly the same - >>> produce exactly the same samples - after they are sampled at 8000 samples >>> per second. No amount of digital signal processing after that point can >>> distinguish the two cases, so the aliasing in the up-sampled FFT is >>> inevitable, with or without windowing. >>> >>> I may yet get a G3 on Ebay as you say, but I was hoping for some >>> independent confirmation of this problem with a codebase that had nothing >>> in common with my code, in case there is something I am doing in the code >>> that is making the difference. So if you have an app that processes sound >>> and can detect frequency content above 4000 Hz, just have someone with one >>> of these failing devices go to piano and play the highest "B". That is >>> usually about 4019 Hz. If the device is failing as I predict, there should >>> also be an indication of a tone at 3981 Hz. >>> >>> Robert Scott >>> Hopkins, MN >>> >>> On Sunday, January 31, 2016 at 1:39:58 PM UTC-6, Julian Bunn wrote: >>> >>>> If you are only getting 8000 sps then even with interpolation to 44100 >>>> you would never see any signal above 4000Hz in an FFT, right? Are you >>>> windowing the FFT? >>>> >>>> If there are truly problems like this with the audio firmware on the LG >>>> G3 and Nexus 7, I haven't heard any reports from my users about them. >>>> That's not to say there can't be an issue, of course :-) If I were you, I >>>> would obtain a cheap used G3 on Ebay to test with. >>>> >>>> >>>> >>>> On Saturday, January 30, 2016 at 6:13:08 PM UTC-8, RLScott wrote: >>>>> >>>>> But are you sure you are getting the sample rate you asked for? How >>>>> would you know? As you can see from my very first posting, all the checks >>>>> you are doing here work fine for me too, and I actually do get the number >>>>> of samples per second I ask for. But they are not true samples. They >>>>> have >>>>> been faked by up-sampling. The system takes 8000 samples per second and >>>>> then duplicates each sample enough times to make up 44100 or 22050 or >>>>> whatever. But I know those samples are not true samples because I see >>>>> aliasing around 4000 Hz in the frequency spectrum. Unless you >>>>> specifically >>>>> look for this problem by testing with a pure tone above 4000 Hz and >>>>> analyze >>>>> with an FFT and look for aliasing below 4000 Hz, everything will appear >>>>> fine. Again this only happens on a very few models - specifically the LG >>>>> G3 and the Asus Nexus 7. >>>>> >>>>> On Wednesday, January 27, 2016 at 10:57:45 AM UTC-6, Julian Bunn wrote: >>>>>> >>>>>> Yes, that looks fine to me ... In case it helps, here is a snippet of >>>>>> what I do to check a samplerate is going to work: >>>>>> >>>>>> minBuffer = AudioRecord >>>>>> .getMinBufferSize(rate, config, encoding); >>>>>> if (minBuffer != AudioRecord.ERROR_BAD_VALUE >>>>>> && minBuffer != AudioRecord.ERROR) { >>>>>> boolean bGood = true; >>>>>> try { >>>>>> audio = new AudioRecord(audioSource, rate, config, >>>>>> encoding, minBuffer); >>>>>> int istate = audio.getState(); >>>>>> if (istate != AudioRecord.STATE_INITIALIZED) >>>>>> bGood = false; >>>>>> } catch (Exception e) { >>>>>> bGood = false; >>>>>> } >>>>>> audio.release(); >>>>>> audio = null; >>>>>> if (bGood) >>>>>> return rate; >>>>>> >>>>>> >>>>>> On Tuesday, January 26, 2016 at 12:49:46 PM UTC-8, RLScott wrote: >>>>>>> >>>>>>> I am calling >>>>>>> AudioRecord.getMinBufferSize(44100,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT) >>>>>>> and using the returned minAudioRecordBufSize in >>>>>>> >>>>>>> new AudioRecord(MediaRecorder.AudioSource.MIC, >>>>>>> 44100,AudioFormat.CHANNEL_IN_MONO, >>>>>>> AudioFormat.ENCODING_PCM_16BIT, >>>>>>> minAudioRecordBufSize); >>>>>>> >>>>>>> Is that sizing the buffers correctly? >>>>>>> >>>>>>> Thanks for the offer for the enumeration app, but I do not have a >>>>>>> failing device at my disposal. Only a few devices are failing, and they >>>>>>> are all owned by my customers. I can't ask too much of them in the way >>>>>>> of >>>>>>> debugging help. >>>>>>> >>>>>>> >>>>>>> On Friday, January 15, 2016 at 1:34:15 AM UTC-6, Julian Bunn wrote: >>>>>>>> >>>>>>>> Make sure you are sizing the buffers correctly i.e. respecting the >>>>>>>> minimum recording buffer size (in bytes) required. If you don't then I >>>>>>>> believe the system will drop you down to 8kHz sample rate, which is >>>>>>>> what >>>>>>>> you are seeing (I think?). >>>>>>>> >>>>>>>> >>>>>>>> On Wednesday, December 23, 2015 at 9:52:37 AM UTC-8, Robert Scott >>>>>>>> wrote: >>>>>>>>> >>>>>>>>> I first call *AudioRecord.getMinBufferSize(22050...* If this >>>>>>>>> returns an error (<1) then I call >>>>>>>>> *AudioRecord.getMinBufferSize(44100...* Whichever one of these >>>>>>>>> calls succeeds, I use that rate in my call to "*new >>>>>>>>> AudioRecord(..,sampleRate..)*" >>>>>>>>> >>>>>>>>> I don't actually have one of these misbehaving devices, so my >>>>>>>>> experiments so far have been with the help of my customers. >>>>>>>>> >>>>>>>>> -Robert Scott >>>>>>>>> Hopkins, MN >>>>>>>>> >>>>>>>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "Android Developers" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/android-developers/4yG4_Gw4Ilc/unsubscribe >>> . >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at https://groups.google.com/group/android-developers. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/android-developers/6b7520f2-8376-4f1c-9f84-8f7f310846ae%40googlegroups.com >>> <https://groups.google.com/d/msgid/android-developers/6b7520f2-8376-4f1c-9f84-8f7f310846ae%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "Android Developers" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/android-developers/4yG4_Gw4Ilc/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/android-developers. > To view this discussion on the web visit > https://groups.google.com/d/msgid/android-developers/ecdce8c1-e5a8-463d-a9f6-6852749e6c34%40googlegroups.com > <https://groups.google.com/d/msgid/android-developers/ecdce8c1-e5a8-463d-a9f6-6852749e6c34%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/android-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/android-developers/CAAxkZQv7-LEe4Ey24nWqkUH5ou-_TFCFA%2BwCciQ%3DcuP9Yf6mMA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

