Hallo Leute,
ich bin gerade dabei mit einem DSP c6713 über den Lin Eingang mit 48KHz
ein Audiosignal einzulesen. Die diskreten Werte möchte ich gerne
oversampeln und gleichzeitig die spektralanteile über fs/2 vermeiden.
dafür ist ein CIC Interpolations Filter bestens geeignet. oversampling
soll mit Faktor 8 oder 16 laufen. Danach werde ich das Signal mit einer
Delta Sigma Modulation verarbeiten.
die Delta Sigma Modulation funktioniert und das einlesen auch. nun fehlt
nur noch der CIC Filter. Da hängt es bei dem oversampling.
1
unsignedconstoversampling=8;
2
3
comb1=input-last_input;
4
comb2=comb1-last_comb1;
5
6
last_input=input;
7
last_comb1=comb1;
8
9
10
for(s=0;s<oversampling;++s){
11
integrator1=integrator1+comb2;
12
yn=integrator2+integrator1;
13
}
14
Output=yn/4;
das soll ein CIC Filter mit zwei Comb filter dann oversamplig und da
zwei integrations filter darstellen.
Ist dies richtig umgesetzt mit der überabtastung? Bin mir nicht ganz
sicher. der DSP hat einen 12bit ADC.
LG
Moin,
Nee, das tut so nicht. Dein Ausgang ist ja schonmal ausserhalb der
Schleife, wie sollen da dann 8 Werte fuer jedes Eingangssample
rauskommen. Auch die Arithmetik haut so sicher nicht hin.
Biste dir sicher, dass CIC auf einem DSP fuer deine Anwendung so eine
tolle Wurst ist? Ich glaub's naemlich nicht. Das ist fuer FPGAs prima,
wo die Bitbreiten der Rechungen beliebig einstellbar sind. Weder
Sperrdaempfung noch passband-flatness sind bei CIC prickelnd. Aufm DSP
werden dich doch MAC Operationen sicher weniger Schmerzen kosten als auf
einem FPGA, also nimm lieber "normale" Filter.
Gruss
WK
Ich glaube, hier stimmt so ziemlich nichts!
Weder macht es Sinn, den AD zu oversamplen, noch muss oder kann man
dann noch Frequenzen fs/2 zu vermeiden (wo sollen die herkommen bei der
8/2-Situation) und auch das anschließende Delta-Sigma bringt nichts
Neues. Damit kann auch der CIC-Filter dahinter nichts Interessantes
liefern ausser Filterartefakten.
Wenn, dann muss eine fs/2 Dämpfung dem 48kHz ADC erfolgen und dann gfs
nochmal eine Filterung runter auf das benötigte Band, wenn es weniger
sind, als 20kHz -
oder
man benutzt gleich einen Delta-Sigma-Modulator und einen entsprechenden
Filter, um genau das obige manuell zu tun. In dem Fall baut man hinter
den CIC noch einen FIR. Das ist dann in Summe optimal.
Hallo,
vielen Dank für eure Antworten.
Ich erzähle mal kurz etwas zu meinem Vorhaben.
Ich möchte ein Audio Signal einlesen mit 44.1 oder 48 KHz. Dieses möchte
ich dann mit einer Delta Sigma Modulation (in einem 2. Interrupt welcher
mit einer 8 fach höheren frequenz läuft) in ein 1 bitstream auf den Pin
40 vom HPI Steckport ausgeben. An den Ausgang vom Port schalte ich meine
PWM Verstärker Schaltung und vor dem Lautsprecher einen Tiefpass filter
der mir das Audio Signal wieder erstellt.
Soweit läuft das alles auch. Auch die Ausgabe funktioniert recht gut.
Aber ein Problem habe ich.
Ich habe leichte Störgeräusche auf meinem Ton Signal(siehe Bild, einmal
1KHz Eingangssignal und dann mein Ausgangssignal)
Aber wenn ich die Musik beziehungsweise mein input Ausschalte oder
abmache, dann habe ich auch die ganze Zeit Störsignale drauf. Ích dachte
mir das ich diese mit einem Filter vor dem Delta Sigma Modulator raus
bekomme. Leider weis ich nicht genau wo die Störsignale herkommen
sollen. Liegt ja kein input Signal mehr an. An der Verstärker Schaltung
liegt es nicht.
Habt Ihr eine ahn ung wo das Störsignal herkommt oder wie ich dies
entfernen könnte?
1
interruptvoidc_int11(void){//48KHz abtastung des Audio Signals
Also dein 1 kHz Tonsignal (nicht der vergleichs-Sinus) sieht ja
grauenvoll aus. Da war die simple Audioausgabe der Lernbetty ja bereits
besser...
Ich habe den Eindruck, daß dein gesamtes Ansinnen nicht stimmig ist.
Worum geht es dir denn tatsächlich? Wenn du nur fernübertragen willst,
wäre eine Kombination aus Stereo-ADC -- I2S -- Stereo-DAC -- Verstärker
eigentlich sinnvoller. Ob du nun einen normalen Verstärker oder nen
"Klasse-D" oder sonstwas als Verstärker nimmst, ist ne andere Sache.
W.S.
Hallöchen,
jup das 1KHz Sinus Signal sieht echt nicht gut aus.
Ich möchte eine digitale Delta Sigma modulation aufbauen und
schauen/untersuchen wie gut man dies auf einem DSP board hinbekommt. Und
ich möchte eine normale Pulsweitenmodulation auf einem DSP und eine
Delta Sigma modulation auf dem DSP untersuchen/ vergleichen. Und es
sollte auch etwas bei raus kommen(class d verstärker). Das signal soll
ein Pulssignal sein was ich mir wie gesagt aus dem Port geben lasse. und
dann einen analogen tiefpass filter wieder umwandle und verstärke.
Ich verstehe halt nicht ganz wo mein Fehler liegt. Theoretisch sollte es
funktionieren. Ich taste das Signal mit 48KHz ab. Jetzt sollte ein
oversampling kommen wo ich es auf ca. 800KHz komme. das schaffe ich in
dem ich ein Interrupt mit 16 facher geschwindigkeit auslöse. In diesem
Interrupt wird die Delta Sigma modulation durchgeführt und ausgegeben.
somit habe ich meine höhere Schaltfreqeuenz.
Was aber jetzt fehlt, wäre ein CIC Filter oder ein normaler FIR Filter.
Weil ich kann ja nicht in dem schnellen Interrupt immer den gleichen
ingelesenen wert nehmen. den darf ich nur einmal nehmen und dann die
restlichen 15 mal den eingang mit null füllen. Aber um die nullwerte an
das signal anzunähern muss ich einen FIR Filter von der Modulation
anwenden. dieser Filter erstellt mir die passenden zwischen werte von
dem oversampling.
so die theorie. Theorie und Paxis ist aber meist ein sehr weiter
unterschied. Leider.
LG
Robert1301 schrieb:> Ich habe leichte Störgeräusche auf meinem Ton Signal(siehe Bild,
Wenn das leicht ist, hast du aber sehr tiefe Ansprüche an die
Tonqualität.
Dein Delta Modulator sieht irgendwie nicht richtig aus, ich würde mal
sowas probieren (ist natürlich ungetestet):
1
interruptvoidc_int14(void)// Interrupt wird 16 mal öfter aufgerufen
2
{
3
//Delta Sigma Modulation
4
staticintfilter;
5
GPIO_pinWrite(gpio_handle,GPIO_PIN2,yn>filter);
6
filter+=(yn>filter?0x7FFF:-0x7FFF)-filter)>>3;
7
}
Da ich nicht weiss wie min und max definiert sind habe ich Hex-Zahlen
genommen. Die Filterfrequenz wird durch das >> 3 bestimmt und du musst
etwas damit experimentieren (>>2, >>4, >>5 ...).
Ohne Eingangssignal (yn=0) solltest du ein dauerndes toggeln des
Ausgangspins erhalten, also etwa 400 kHz Rechteck.
Andi
Robert1301 schrieb:> so die theorie.
Moment mal, was redest du von "Oversampling"? Wenn du zwischen deinen
echten Abtastwerten Zwischenschritte benötigst, dann mußt du
interpolieren. Bei Faktoren im 2er-System geht das relativ leicht, da
brauchst du bloß Rechtsverschiebungen.
Und irgendwelche zusätzlichen Interrupts (mit 800 kHz !!) halte ich für
dezent daneben. Sowas mußt du im Interrupt deines Empfangszweiges, also
mit den 48 kHz machen, dort einen Ausgangs-Fifo füllen und den dann per
DMA herausbringen. Fragt sich nur, WIE? Immerhin hast du ja allzeit
keinen Bitstream, sondern Samples mit 16 oder 24 Bit Breite. Die bis zum
nächsten Sample in einen repräsentativen Bitstream verwandeln zu wollen,
schaffst du nur per Hardware und du landest bei den Bitzeiten vermutlich
jenseits von Gut und Böse.
Mach doch erstmal eine Rechnung auf, was du für eine
Amplituden-Auflösung überhaupt haben willst, dazu dann die finale
quasi-Samplerate, mit der du ausgeben willst und dann sehen wir weiter.
Bei schlichter PWM kommt an Muttertakt für den PWM so etwa
Samplefrequenz*Amplitudenauflösung heraus - und das ist auch schon
ziemlich viel.
W.S.
Hallöchen,
vielen dank für eure Antworten.
Andi schrieb:> Dein Delta Modulator sieht irgendwie nicht richtig aus, ich würde mal> sowas probieren (ist natürlich ungetestet):
Ich habe deinen Code mal probiert. Im anhang habe ich die Aufzeichnung
vom Oszi. Also es sieht schonmal besser aus, dass muss ich sagen :)
Aber es ist noch ein Rauschen zu hören was du in dem Anderen Bild
siehst. Dieses Bild ist bei yn=0. Das rauschen pegelt wirklich um ca.
400KHz.
Könnt Ihr mir erklären warum bei yn = 0 eine solche Frequenz entsteht,
obwohl yn=0? Bekommt man diese reduziert, in dem man einen Delta Sigma
modulator 2. Ordnung implementiert?
W.S. schrieb:> Wenn du zwischen deinen> echten Abtastwerten Zwischenschritte benötigst, dann mußt du> interpolieren.
Ach stimmt, das meinte ich doch, interpolieren.
Also ich habe am TMS320c6713 einen ADC dran mit einer Auflösung von
16Bit und taste mein Signal mit 48KHz ab. Meine finale samplefrequenz
sollte um das 14- 16 fache also ca.672 bis 768KHz liegen.
Ich kann doch in meinem zweiten interrupt meine Berechnung durchführen
und durch die delta sigma modulation meinen bitstream erzeugen. Dort
kann ich diesen gleichzeitig auf den output pin ausgeben und habe somit
meine PWM auf dem pin. ich schaffe bei 48KHz meinen zweiten
interruptabarbeitung 20- 22 mal durchführen zu lassen mit der Delta
Sigma berechnung.
Du benötigst eine PDM, die das Signal des AD-Wertes richtig übersetzt.
Das muss kontinuierlich erfolgen und darf nicht an einen INT gebunden
sein, es sei denn er ist vollkommen synchron!
@Robert:
Ich mir schon sowas gedacht und nun verstehe Ich auch, wozu der CIC sein
soll: Der macht nämlich genau die benötigte Umsetzung auf die erhöhte
Frequenz, aber ganz so einfach geht das nicht. Du musst den digitalen
Ein-Bit-Datenstrom so steuern, dass er dem Eingangswert entspricht,
brauchst also ein Modell Deiner Last. Ansonsten geht das nur pauschal
mit einer (linearen) Annahme.
Du must die Pulsdichtemodulation mit dem Ausgang des CIC beschicken
und davor Filtern, wie Ich es oben beschrieben habe. Der CIC wirkt als
Interpolationsfilter, generiert aber Knicke und damit Oberwellen. Du
hast dann ein DSD8 Signal mit 384kHz.
Um da die volle Audioqualität in 16 Bit rauszubringen, braucht man aber
wenigstens mal das 10fache. Die MEMS-Mikros arbeiten auf etwa der
Frequenz. Richtig gutes Audio bekommts Du mit dem 100fachen. Meine
PLD-Orgel arbeitet mit einer nichtlinearen, geregelten PDM direkt aus
dem FPGA:
http://www.96khz.org/htm/virtualpldorgan07spartan3e.htm
Um das per Interrupt zu steuern, muss das synchron passieren, kann also
mit 800kHz abgesampelt werden und dann am Ausgang synchronisert werden.
sowas kann man aussen mit einem Gate machen. Wenn Du das IM Controller
machen willst, geht das nur voll synchron mit einem programmierbaren
Timer, der den Ausgang latchet.
intinput=AIC23_data.channel[RIGHT];// output to buffer
14
15
yn=input;
16
}
17
18
19
// Variablen für die Delta-Sigma-Modulation
20
intoutput=0;
21
intintegration=0;
22
23
//aufruf mir rund 800KHz
24
interruptvoidc_int14(void){
25
//CIC Filter
26
longcomb1=yn-last_input;
27
longcomb2=comb1-last_comb1;
28
longcomb3=(int)(comb2-last_comb2)>>16;
29
30
last_input=yn;
31
last_comb1=comb1;
32
last_comb2=comb2;
33
integrator1=integrator1+comb3;
34
integrator2=integrator2+integrator1;
35
yn=yn+integrator2;
36
37
//Beispiel für einen FIR Filter
38
/* x[0] = yn;
39
unsigned i=0;
40
for(i=0 ; i<BL ; i++)
41
y += B[i]*x[i];
42
43
for (i=(BL-1);i>0;i--)
44
x[i] = x[i-1];
45
yn=y;
46
*/
47
48
// PWM modulation (Delta-Sigma-Modulation)
49
staticintfilter;
50
GPIO_pinWrite(gpio_handle,GPIO_PIN2,yn>filter);
51
filter+=((yn>filter?0x0400:-0x0400)-filter)>>3;
52
53
}
54
55
56
intmain(void){
57
58
TIMER_configArgs(hTimer1,
59
TimerControl,/* use predefined control value */
60
0x00000005,/* set period */
61
0x00000000/* start count value at zero */
62
);
63
while(1){
64
}
65
}
Durch das CIC Filter wird das Signal entweder total schlimm oder es
kommt nur rauschen und sowas alles raus. Aber das Signal wird nicht
besser.
Ist in der Implementierung des FIlters was falsch?
Ich habes es auch mal mit einem FIR Filter versucht. Aber da wird es
auch nciht wirklich besser. Die Filter Koeffizienten habe ich in Matlab
mit dem Filter tool erstellt.
> Ist in der Implementierung des FIlters was falsch?
Keine Ahnung, ich habe manchmal Probleme fremden Code nachzuvollziehen
und meine eigenen Experimente mit CIC Filtern sind schon einige Tage
her.
Ich kann jetzt auch nicht direkt erkennen welche Ordnung Dein Filter
hat. Aber eines macht mich stutzig:
> floata yn;
floats haben bei CIC Filtern eigentlich nichts zu suchen, ausser am
Eingang.
Ich erinnere mich, das meine Filtersimulation (bei höheren Ordnungen)
erst brauchbar war, nachdem ich auf "uint64_t" umgestiegen war. Die
Anzahl der benötigten Datenbits ist von den Filterdaten abhängig. Bei
"float", wenn man die Exponenten Bits abzieht, kann das schnell zu wenig
sein.
http://www.informit.com/articles/article.aspx?p=361985&seqNum=4
BTW, CIC Filter sind irgendwie blöd zu implementieren (finde ich), da
sie nicht in das übliche Schema passen. Ich habe 4 Anläufe gebraucht und
auch das ist eigentlich nur ein Hack. Das hat mir aber gezeigt, das
diese Dinger nicht immer die eigentlich erhoffte geniale Lösung sind.
Eigentlich ist ein CIC recht einfach zu implementieren - Datenbereiche
und Überläufe müssen natürlich beachtet werden. Kann es sein, dass Deine
Daten nicht symmetrisch sind?
Baue Dir das Ding mal in Excel und gibt Integrator und Divisor getrennt
aus.
Kann es sein, dass das Problem darin besteht, dass er erst differenziert
und dann integriert? Damit bewegt er sich in der Domäne ja abwärts,
statt aufwärts - hat also keine Summierung über die Eingangswerte und
Differenz von Integralen wie Ich das kenne.
??
Chrysler001 schrieb:> ich bin gerade dabei mit einem DSP c6713 über den Lin Eingang mit 48KHz> ein Audiosignal einzulesen. Die diskreten Werte möchte ich gerne> oversampeln und gleichzeitig die spektralanteile über fs/2 vermeiden.
Das erfordert ein anti-alias-filter VOR dem Wandler
> dafür ist ein CIC Interpolations Filter bestens geeignet.
Sagt wer?
> Ist dies richtig umgesetzt mit der überabtastung?
CIC-filter werden unterabgetastet, oder?
Robert1301 schrieb:> Ich verstehe halt nicht ganz wo mein Fehler liegt.
CIC-Filter sind für soetwas nicht unbedingt geeignet, wenigstens nicht
ohne zugeschalteten FIR-Filter, der die vielen Problemchen eines CIC
beseitigt. Für Interpolation wiederum würde Ich zu splines oder wavelets
raten. Ein wavelet hätte den symphytischen Vorteil einer genau
definierten Grenzfrequenz.
Andi F. schrieb:> CIC-Filter sind für soetwas nicht unbedingt geeignet, wenigstens nicht> ohne zugeschalteten FIR-Filter, der die vielen Problemchen eines CIC> beseitigt.
Welches wären diese "vielen Problemchen"?
CIC-Filter können so schlecht nicht sein, werden ja vielfach genutzt.
Wieviel Bit hat der Datentyp Long und wie viele Bit den Eingangssignal?
Bei ein CIC-Interpolator wächst nach jeder Stufe die Bitbreite um
Upsamplingfaktor *differentiellen Delay, bei dir insgesamt also
3*8*1=24. Und das Endergebnis musst du dann wieder entsprechend nach
rechts schieben. Die Bitbreiten kann man noch etwas optimieren aber das
ist nur für FPGA-Implementierungen relevant.
Wenn man die Bildung der Integrale richtig macht und mit binären
Abtastfaktoren arbeitet, ist der Überlauf egal, bzw. wird indirekt
miterledigt. Daher braucht man nicht beliebig große Bitbreiten.
Okay, der Thread ist schon älter, aber...
CIC-Nutzer schrieb:> Andi F. schrieb:>> CIC-Filter sind für soetwas nicht unbedingt geeignet, wenigstens nicht>> ohne zugeschalteten FIR-Filter, der die vielen Problemchen eines CIC>> beseitigt.>> Welches wären diese "vielen Problemchen"?> CIC-Filter können so schlecht nicht sein, werden ja vielfach genutzt.
Ich vermute, er meint den Abfall im Passband gegen die Grenzfrequenz hin
(Figure 11 in diesem exzellenten Artikel:
https://www.embedded.com/design/configurable-systems/4006446/Understanding-cascaded-integrator-comb-filters)
Henk schrieb:>> ist der Überlauf egal, bzw. wird indirekt>> miterledigt.> Wie soll denn das funktionieren?
Solange du nur einen Überlauf pro Abtastung hast, ist durch die
Modulo-Arithmetik vom Zweierkomplement alles in Ordnung. Beispiel
Dezimation: erst integrierst du auf, dann wird unterabgetastet, dann
differenziert. Der Differenzierer zieht also zwei aufeinanderfolgende
Werte voneinander ab. Die Differenz ist die selbe, egal ob ein(!)
Überlauf stattgefunden hat oder keiner, dank der Modulo-Arithmetik.
Henk schrieb:> Aber funktioniert das auch beim Integrieren?
Sicher, denn wenn Du mit binären Vektoren der Länge Log(n,2) rechnest,
dann ist die Zahl n+a - b, dasselbe wie a - b und auch "a-n - b", je
nachdem, welches der drei Ergebnisse zwischen 0 und n-1 liegt. Das liegt
am simplen Über- und Unterlaufverhalten. "Modulo" wurde schon in die
Diskussion geworfen.
Es muss nur dafür gesorgt werden, dass nicht infolge eines zu großen
Schrittes mit einem negativen Wert ein doppelter Unterlauf oder Überlauf
erzeugt wird. Das ist aber bei den binären Konstellationen eines
"normalen" CIC nicht möglich, wenn die Vektorbreiten der Folgestufe um
soviel größer ist, wie die das Verhältnis der Abtastung vorgibt. Ich
habe das vor einer Zeit mal konkret in einem Excel und Modelsim
nachvollzogen um ein CIC aus dem Netz, welches die Vektorbreiten über
generics einstellt, zu verdeutlichen.
Natürlich klappt die Geschichte bei Abtastverhältnissen, die nicht
binäre Werte sind, nicht! Wir hatten vor einiger Zeit hier ein Beispiel
mit der Konversion von 49152 zu 48000 über 5:5:5 zu 4:4:4 * 2.
Da geht das nicht, bzw. der Überlauf bei Modulo 5 und die sich bildenden
Differenzen müssten händisch behandelt werden.
Nochmal zu dem Spektrum:
Der oft in den Himmel gelobte CIC ist letztlich nichts anderes, als ein
simpler Mittelwertfilter mit n Stufen mit den entsprechenden Oberwellen
einer Rechteckfaltung und kein besonders guter Filter. Er ist nur
besonders effektiv und eignet sich für Fälle, wo man wenig
Rechenleistung hat oder es von der Bandbreite nicht anders geht, weil
man keinen FIR mehr unterkriegt.
Er muss in der Regel vorgefiltert oder nachgefiltert werden. Man kann es
auch zwischenfiltern, wenn man die Integratorstufen und Diff-Stufen
auftrennt und auf die letztliche Bandbreite abstimmt. Ich benutze sowas
in meiner Workstation, um die Audio-Abtastrate auf FPGA-Takt zu kriegen.
Auch da muss man einen Zwischenfilter einsetzen, bevor man damit weiter
rechnet, weil sonst die künstlich erzeugen Fehler durch die
Differenzialbildung Probleme machen.
CIC-Nutzer schrieb:> CIC-Filter können so schlecht nicht sein, werden ja vielfach genutzt.
Die dazu erschöpfende Antwort wurde von anderen Schreibern schon
gegeben: Schlechte Passbanddämpfung und ohne weitere Filter nicht
verwendbar. Ich wüsste nicht, wofür. Die Erfindung dieser Filter geht in
die Mitte des vergangenen Jahrhunderts zu rück. Das sagt schon alles.