Frequency detection (audio)


Closed Thread
Results 1 to 23 of 23

Hybrid View

  1. #1
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Hi Bert,

    I re-enabled hserout out in the ISR again, and these are the TMR1 counts I'm getting for successive comparator2 interrupts with an audio input of 82.4Hz (the lowest note/frequency on a standard tuning electric guitar)...

    42947
    42995
    42946
    42998
    42944
    43003
    42960
    43012
    42964
    43022
    42974
    43032
    42991
    42948
    18932
    18559
    42953
    43012
    42955
    43005
    42957
    43001
    42943


    A couple of dodgy ones in there, but those aside, the TMR1 counts are coming in lower at about 43,000?

    Code:
    @ __CONFIG _CONFIG1, _FCMEN_OFF & _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _CP_ON & _IESO_OFF & _BOREN_OFF & _PWRTE_OFF
    @ __CONFIG _CONFIG2, _PLLEN_OFF & _STVREN_OFF & _LVP_OFF 
    DEFINE  OSC 16
    INCLUDE "DT_INTS-14.bas"     
    INCLUDE "ReEnterPBP.bas"     ' Include if using PBP interrupts
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    DEFINE HSER_SPBRG 25  ' 38400 Baud @ 16MHz, 0.16%
    SPBRGH = 0
    BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
    '16F1828 Pin settings....
    ' PIN# NAME     USE & CONNECTION
               '  1   Vdd      +5VDC power supply
    TRISA.5 = 0'  2   RA5      
    TRISA.4 = 1'  3   RA4      
    TRISA.3 = 1'  4   RA3      
    TRISC.5 = 0'  5   RC5      
    TRISC.4 = 0'  6   RC4      C2OUT 
    TRISC.3 = 1'  7   RC3         
    TRISC.6 = 0'  8   RC6           
    TRISC.7 = 0'  9   RC7      
    TRISB.7 = 0'  10  RB7       
    TRISB.6 = 1'  11  RB6       
    TRISB.5 = 1'  12  RB5       
    TRISB.4 = 1'  13  RB4       
    TRISC.2 = 1'  14  RC2      
    TRISC.1 = 1'  15  RC1      C12IN1- (FREQ DETECT)
    TRISC.0 = 1'  16  RC0      
    TRISA.2 = 0'  17  RA2               
    TRISA.1 = 0'  18  RA1      
    TRISA.0 = 0'  19  RA0      
    '             20  Vss      Ground
    ANSELA     = 0 
    ANSELC     = 0   
              
    APFCON0.2 = 0  'put hserout onto RB7 pin 10 (Pickit 2 RX pin)
      
    '-------------------------------------------------------------------------
    Osccon = %01111010   'sets the internal oscillator 
    CPSCON0 = 0    ' capacitive sense module off
    CM1CON0 = 0     ' comparator1 module off
    CM2CON0.7 = 1 ' comparator2 on.
    CM2CON0.5 = 1   'enable the output on a pin
    CM2CON0.4 = 1 'invert the polarity
    CM2CON0.1 = 1   'ENABLE HYSTERISIS
    CM2CON1.7 = 1' enable interrupts on _+ve going transition
    CM2CON1.5 = 0   ' set comparator comparison input pin to the DAC
    CM2CON1.4 = 1   ' set comparator comparison input pin to the DAC
    CM2CON1.1 = 0   'SELECT C12IN1- (PIN 15, RC1)
    CM2CON1.0 = 1   'SELECT C12IN1- (PIN 15, RC1)
    
    DACCON0.7 = 1 ' DAC ON
    DACCON0.6 = 1 ' DAC ON
    DACCON0.5 = 0  'put the output of the DAC o the DAC out pin
    DACCON0.3 = 0   'SET DAC +VE REFERENCE REFERENCE TO VCC
    DACCON0.2 = 0   'SET DAC +VE REFERENCE REFERENCE TO VCC
    DACCON1 = %00000001   'sets the DAC voltage output to be very low (to use for the comparator to compare against.
    OPTION_REG.7 = 0
    ASM
    INT_LIST  macro ; IntSource,    Label,         Type, ResetFlag?
        INT_Handler  CMP2_INT,  _CMP2_Interrupt,  ASM,  YES 
        endm
        INT_CREATE       ; Creates the interrupt processor
    ENDASM
    TMR1 = 0
    T1CON = %00000111
    @ INT_ENABLE CMP2_INT   ; Enable 'Int On Change' interrupts
    loop1:
    PAUSE 1
    GOTO loop1
    
    'Interrupt+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    CMP2_Interrupt:   ' COMPARATOR2 INTERRUPT.
    @ INT_DISABLE CMP2_INT
    BSR=0
    hserout [dec tmr1,13,10] 
    toggle portc.7
    TMR1=0
    @ INT_ENABLE CMP2_INT
    @ INT_RETURN
    Last edited by HankMcSpank; - 7th June 2012 at 21:32.

  2. #2
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Just as an experiment, I would like to see how high in audio frequency I can go with something like the ASM interrupt method discussed in this thread...

    http://www.picbasic.co.uk/forum/showthread.php?t=14513 (even though I asked a question in that thread, I confess to not being able to move forward!)

    So would anyone do a little bit of ASM code that will toggle portC.7 when comparator2 interrupts on a 16f1828?

  3. #3
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Just thinking out loud here...if all the overhead comes from entering & exiting the interrupt routine ...if I dedicate my main loop solely to measuring high/low transitions on a pin (ie feed the PICs comparator output from its output pin into another digital input pin), would this be workable?

    Just pondering how I can get the PIC to detect up to 1.5khz!

  4. #4
    Join Date
    Sep 2009
    Posts
    755


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Did you try COUNT or PULSIN or using TIMER to count freq...
    I have set TMR0 to overflow each second and trigger interrupt. In ISR read TMR3, then reset it.
    It goes to 50KHz without any problem. You also can use shorter time, but then you have lower resolution.

  5. #5
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Hi Hank!
    There are several approaches to solving what you wish to do. One site ( http://www.intmath.com/trigonometric...hase-shift.php ) will give you the math involved in determining a given musical note. Another is ( http://liutaiomottola.com/formulae/freqtab.htm ). If you look at the frequencies for each note notice that if you take the highest "C" note, the next octave of "C" below it is exactly 1/2 the frequency. Where things become "spritual" is that when mixing musical note the mix will give the sum, the difference, and the individual frequencies. The only way I can see to make the distictions would be with "band-pass" filters or a graphic equalizer. You would probably have to take the range of audio (20-20,000 Hz) and divide it into something like 10 or more ranges and then using a high pass and low pass filter "comb" the input sound. Or one big look-up table! The secondary problem would come from how perfectly the guitar is tuned. Hope this helps, Ed

  6. #6
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Thanks guys...I'm now approaching this in a slightly different way & getting reasonable results (I think!)

    I'm using timer1 gate & comparator2

    Here's the sequence....

    Comparator2 goes high....raises a gate on timer1...timer1 starts counting
    Comparator2 goes low ....gate drops ...timer1 stops counting
    When gate drops a timer1gate interrupt gets flagged
    A DT Interrupt traps this (T1GATE_INT) & my program jumps to an ISR
    I spit out the contents of timer1 in the ISR serially to my PC.
    clear timer1
    rinse repeat.

    It seems I can get trap upto 4khz audio frequency with nowhere near as many spurious readings as before (I'm still using a sig gen though)....above 4khz the counts start going a bit erratic.

    here's the timer1 readings for 4000hz (16Mz Oscillator)...

    495
    495
    495
    495
    494
    495
    495
    495
    494
    495
    495
    495
    494
    495
    495
    495
    494
    495
    495
    495
    494
    494
    495

    (the gate is only trapping 'half a waveform period' so the counts are half what you'd expect when detecting 4khz)

    Pretty steady (they should be 500...& I can't quite account for where the missing counts are going!)
    Last edited by HankMcSpank; - 10th June 2012 at 00:03.

  7. #7
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Hi Hank,
    This may sound like a dumb question and you are doing an analog to digital conversion at some point? Also if you only wish to work with half wave, a simple diode will do this for you. Best, Ed

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts