Pagina 1 van 1

Verschil berekenen tussen 2 FRD files

Geplaatst: wo 06 jun 2007, 1:08
door b_force
Ik ben gisteren bij Jeroen geweest, en we zijn er oa achter gekomen dat waarschijnlijk mijn mic een bultje heeft bij 12KHz. (eigenlijk loopt hij vanaf zo'n 6KHz toe)

Dat is vrij irritant, aangezien je nu moeilijk kan bepalen hoe het hoog nu zal verlopen.

Het idee is dan ook om de mic van Jeroen als een soort referentie te gebruiken en om het verschil tussen de 2 gemeten waardes te gebruiken.

Met andere woorden, de 2 curvers moeten van elkaar worden afgetrokken.

Iemand enig idee in welk programma dit kan ?

(met andere woorden, we gaan een mic calibration file maken :) )

Geplaatst: wo 06 jun 2007, 6:37
door Boppo84
excel :-P bestanden moeten natuurlijk wel dezelfde resolutie hebben...

Geplaatst: wo 06 jun 2007, 11:06
door voodooless
Anders ff zelf een tooltje maken, moet niet al te moeilijk zijn toch?

Geplaatst: wo 06 jun 2007, 13:42
door Henkjan
lijkt me niet al te lastig in excel te zetten. en als de resolutie niet gelijk is das is dat met een beetje fatsoenlijke interpolatie formule zo opgelost. of je moet met een curvefit prog een functie brouwen van de correctiecurve, dan ben je helemaal snel klaar zonder elke keer tabellen naast el kaar te gooien.

hier de VBA code voor 2 smaken interpolatie, persoonlijk gebruik ik vrijwel altijd de lagrange (spant een 2e graads polynoom op over 4 (of 3)punten en gebruikt die voor de interpolatie, extrapolatie is altijd lineair).

maar voor meetwaarden, met de gebruikelijke spreiding is interpolatie op basis van een gefitte polynoom waarschijnlijk beter. veel plezier er mee.

CODE: Selecteer alles



' ======== algemene instellingen voor VBA ===================================
Option Explicit     ' Force explicit variable declaration                   |
Option Base 1       ' arrays beginnen bij 1                                 |
' ======== algemene instellingen voor VBA ===================================


' ------------ PolyFit ----------------------------------
Function PolyFit(ByVal punt As Double, known_Ys, Optional known_Xs, Optional graad)

Dim Q() As Double, H() As Double, C() As Double, _
    X() As Double, Y() As Double
Dim i As Integer, j As Integer, k As Integer, u As Integer, _
    N As Integer, numfunc As Integer, nf As Integer, graad2 As Integer
Dim Ysum As Double, pf As Double, p As Double
Dim is_mis_X As Boolean

  N = UBound(known_Ys.Value) - LBound(known_Ys.Value) + 1
  If IsMissing(graad) Then
      graad2 = 1 + Int((N - 1) / 2)           ' default: afhankelijk van aantal datapunten
      If graad2 > 2 Then graad2 = 2           ' zonder opgave nooit meer dan een 2e graads polynoom
    Else
      graad2 = CInt(graad)
  End If
  If graad2 > (N - 1) Then graad2 = N - 1     ' altijd graad+1 punten nodig!
  If graad2 < 0 Then PolyFit = 0 / 0          ' exit function with error
  numfunc = graad2 + 1
  nf = graad2 + 2

  is_mis_X = IsMissing(known_Xs)
  If UBound(known_Ys.Value, 2) <> 1 Then PolyFit = 0 / 0  ' exit function with error
  If Not is_mis_X Then _
    If (UBound(known_Xs.Value) <> N) Or (UBound(known_Xs.Value, 2) <> 1) _
      Then PolyFit = 0 / 0

  ReDim Q(1 To numfunc, 1 To nf)
  ReDim H(1 To N, 1 To numfunc)
  ReDim X(1 To N)
  ReDim Y(1 To N)
  ReDim C(1 To numfunc)

  For i = 1 To N
    Y(i) = known_Ys.Item(i)
    If is_mis_X Then
      X(i) = i
     Else
      X(i) = known_Xs.Item(i)
    End If
  Next i

  For k = 1 To numfunc
    For j = 1 To numfunc + 1
      Q(k, j) = 0
    Next j
  Next k

  Ysum = 0
  For i = 1 To N
    Ysum = Ysum + Y(i)
    H(i, 1) = 1
    For j = 2 To numfunc
      H(i, j) = H(i, j - 1) * X(i)
    Next j
    For j = 1 To numfunc
      Q(j, numfunc + 1) = Q(j, numfunc + 1) + H(i, j) * Y(i)
      For k = 1 To numfunc
        Q(k, j) = Q(k, j) + H(i, k) * H(i, j)
      Next k
    Next j
  Next i

  For j = 1 To numfunc
    For k = 1 To numfunc
      If j <> k Then
        p = Q(k, j) / Q(j, j)
        For u = j To numfunc + 1
          Q(k, u) = Q(k, u) - p * Q(j, u)
        Next u
      End If
    Next k
  Next j

  For k = 1 To numfunc
    C(k) = Q(k, numfunc + 1) / Q(k, k)
  Next k

  pf = C(numfunc)
  For i = numfunc - 1 To 1 Step -1
    pf = pf * punt + C(i)
  Next i

  PolyFit = pf
End Function  ' --- van PolyFit ------------------------------------------

     
' ------------ LaGrange ----------------------------------
Function LaGrange(ByVal punt As Double, known_Ys, Optional known_Xs, Optional sorted) As Double
' werkt voorlopig alleen nog maar met vertikale arrays
  Dim i As Integer, N As Integer, is_mis_Xs As Boolean, isSorted As Boolean
  Dim X() As Double, Y() As Double
  
  N = UBound(known_Ys.Value, 1) - LBound(known_Ys.Value, 1) + 1 'n=lengte array
  is_mis_Xs = IsMissing(known_Xs)
  
  If UBound(known_Ys.Value, 2) > 1 Then LaGrange = 0 / 0 'Exit Function
  If Not is_mis_Xs Then
    If UBound(known_Xs.Value, 1) <> UBound(known_Ys.Value, 1) Then LaGrange = 0 / 0 'Exit Function
    If UBound(known_Xs.Value, 2) > 1 Then LaGrange = 0 / 0 'Exit Function
  End If
  
  ReDim X(1 To N), Y(1 To N)
  
  For i = 1 To N
    Y(i) = known_Ys.Item(i)
    If is_mis_Xs Then X(i) = i Else X(i) = known_Xs.Item(i)    'als geen X dan 1,2,3,...
   Next i
  
  If IsMissing(sorted) Or VarType(sorted) <> vbBoolean Then
      isSorted = False
    Else
      isSorted = CBool(sorted)
  End If
  
  If Not isSorted Then Call sort(X(), Y(), N)
  
  If (N = 2) Or (punt < X(1)) Then                  'als maar 2 datapunten of punt < kleinste datapunt
       LaGrange = h_1(punt, Y(1), Y(2), X(1), X(2)) 'lineaire in/extrapolatie
      ElseIf (punt > X(N)) Then                     'als punt > grootste datapunt
            LaGrange = h_1(punt, Y(N - 1), Y(N), X(N - 1), X(N)) 'lineaire extrapolatie
         ElseIf punt < X(2) Then                    'als punt < een-na-kleintste
               LaGrange = (h_1(punt, Y(1), Y(2), X(1), X(2)) + _
                           h_2(punt, Y(1), Y(2), Y(3), X(1), X(2), X(3))) / 2
            ElseIf punt >= X(N - 1) Then            'als punt > een-na-grootste
                  LaGrange = (h_1(punt, Y(N - 1), Y(N), X(N - 1), X(N)) + _
                              h_2(punt, Y(N - 2), Y(N - 1), Y(N), X(N - 2), X(N - 1), X(N))) / 2
                Else
                  i = 3
                  While punt >= X(i)                'zoek plaats van punt in de data-array
                   i = i + 1
                  Wend
                  LaGrange = (X(i) - punt) / (X(i) - X(i - 1)) * _
                              h_2(punt, Y(i - 2), Y(i - 1), Y(i), X(i - 2), X(i - 1), X(i)) + _
                               (punt - X(i - 1)) / (X(i) - X(i - 1)) * _
                                 h_2(punt, Y(i - 1), Y(i), Y(i + 1), X(i - 1), X(i), X(i + 1))
    End If
End Function   ' {van LaGrange}

Geplaatst: wo 06 jun 2007, 13:50
door b_force
Jeetje, dat wordt nog een gepuzzel (ik ben niet zo into de Excel en VBA, meer C++ etc)


Overigens heb ik al op een andere manier ene goed resultaat gevonden.

Ik heb nmlk de Superlux ECM-999, deze lijkt veel op de ECM8000.
Wat ik heb gedaan is de kalibratie file van de ECM8000 ingeladen en ik krijg een resultaat dat verdomd dicht in de buurt komt van de meting van Jeroen.

Mijn idee is om eigenlijk de Superlux te laten kalibreren, echter betaal je hier gauw al 40 euro voor (met verzendkosten etc etc).
Een beetje veel voor een mic van 30 euro :p

Mijn idee is dus om met meerdere mensen een kalibratie uit te laten voeren.
Dus, een iemand stuurt zijn mic op, laten hem kalibreren.
De microfoons verschillen wel iets, maar dat zal zo zijn vaart niet lopen (hooguit 0,5-1dB max ofzo).

Als we dan de kosten delen en dan de kalibratie file uitwisselen hebben we opzich een goedkope oplossing om toch een redelijk nauwkeurige grafiek te krijgen.

Is dit een goed idee ?

(dus enkel voor de mensen met de superlux ECM-999. Ik kan je vertellen dat deze vanaf 6-7KHz niet echt lineair meer verloopt, maar nogal toe loopt )

Geplaatst: wo 06 jun 2007, 13:52
door Henkjan
b_force schreef:
Jeetje, dat wordt nog een gepuzzel (ik ben niet zo into de Excel en VBA, meer C++ etc)
ach, deze routines zijn vertalingen van Pascal programma's die ik weer had geschreven met wat oude Fortran als uitgangspunt :D

Geplaatst: wo 06 jun 2007, 13:54
door voodooless
b_force schreef:
Is dit een goed idee ?
Ik vind dat nog helemaal niet zo'n gek idee :)

Geplaatst: wo 06 jun 2007, 14:10
door b_force
Als het niet zoveel kostte zou ik zelf wel wat ondernemen en dan gewoon wel de kalibratie file willen doorgeven.

Maar vanwege de kosten leek me dit een nette oplossing. We hebben er allemaal profijt van.

Geplaatst: wo 06 jun 2007, 14:11
door voodooless
Misschien iets voor vraag & aanbod?

Geplaatst: wo 06 jun 2007, 14:13
door b_force
lijkt me een goed punt :)

Ik heb eigenlijk geen idee wie er nog meer een superlux ecm999 heeft.
Maar met 3 man is het opzich al te doen (met 2 kan je het al bijna overwegen)

Geplaatst: do 07 jun 2007, 15:44
door Geenius
In Speakerworkshop kun je frd-files (en zma-bestanden) bewerken. Je ziet meteen het resultaat.

Geplaatst: do 07 jun 2007, 15:46
door b_force
hoe bewerk je die dan ?

(ik kan wel simuleren etc, maar bewerken ? )

Geplaatst: ma 11 jun 2007, 10:30
door Geenius
Als je een frd file open hebt staan, kun je uit een van de pull-down menu's de functie Transform kiezen, daarin kun je twee verschillende frd's bijvoorbeeld aan elkaar vast knopen met een vrij te kiezen frequentie (Splice), kun je het verschil tussen twee frd's laten berekenen, je kunt absolute waarden optellen, aftrekken, het aantal punten definieren, en ga zo maar door. :)

Geplaatst: vr 29 jun 2007, 20:42
door weidok
Geenius schreef:
In Speakerworkshop kun je frd-files (en zma-bestanden) bewerken. Je ziet meteen het resultaat.
misschien is dit een goede tool om frd-files
te werken en/of te combineren
heb er geen ervaring mee maar toch ???

http://www.pvconsultants.com/audio/utility/frc.htm