Gast
#6353970
Um den originalen Thread nicht thematisch zu verbiegen: DH1AKF W. schrieb: > Entschuldigung, etwas O.T.: >... > Für W.S. (Gast) habe ich zu seinem Problem diesen Link: > https://forum.pjrc.com/threads/40590-Teensy-Convolution-SDR-(Software-Defined-Radio)?p=247147&viewfull=1#post247147 Vermutlich meinst du das da: "Ok Frank. I figured out how to make complex bandpass filters. After fruitless research and less-fruitless experimentation, it is actually embarrassingly trivial. I don't know why this information is so hard to find. I can't find any good reference material on complex filters - just a bunch of unhelpful info on fancy multi-stage decimating filters which we don't need because the Teensy handles the decimation. Maybe you know of a decent reference? Anyhow, here is how it is done: 1. Create a regular low-pass filter. 2. Create a vector of integers that run from 0:N, where N is the number of coefficients. 3. Take the low-pass numerator coefficients and scalar multiply the whole lot by e^(j*nFc*pi*(0:N)). Where: nFc is the normalized frequency shift that you desire and (0:N) is that vector you created in step 2. In Matlab the command is this: cpx_coeffs = coeffs .* exp(j*nFc*pi*(0:N)) This creates a center-frequency-tunable complex bandpass filter. If the low-pass filter you started with is minimum phase, then the complex filter is also minimum phase (from my experiments so far). I still need to figure out if any random low-pass filter will work. I don't know, but I suspect it may need a particular phase response to act the part of the Hilbert filter. I will do some more messing around tomorrow. 73, Bill WH7U" Kurz gesagt: ich kann's nicht nachvollziehen. Punkt 1 und 2 sind pillepalle, sie bedeuten ja lediglich daß man sich ein Array für den Realanteil und ein zweites Array für den Imaginäranteil macht und zuerst den Realteil mit einem berechneten Lowpaß füllt, den man anschließend quasi verschiebt. Punkt 3 mit der Formel "e^(j*nFc*pi*(0:N))" erscheint mir komplett falsch zu sein, aus folgenden Gründen: 1. sofern man das so versteht: for k:= 0 to N do tap[k].imaginär:= exp(0 + j*Eckfrequenz*pi*k); dann ist das vollständig unsymmetrisch, weil eigentlich k von -(N/2) bis +(N/2) laufen müßte. Also etwa so: tap[k].imaginär:= exp(0 + j*Eckfrequenz*pi*(k-N/2)); 2. der Exponent hat einen Realteil von 0 und einen Imaginärteil, der größer als 0 und proportional zu k ist. Mir fehlt da ein Minuszeichen. Und wenn ich mir das Bild beim Beitrag von WH7U vom 07-24-2020, 12:12 AM anschaue, dann kommen mir nochmal Zweifel. Bei der Phase erwarte ich eine Waagerechte, aber das kann auch vom Verständnis zum Referenzpunkt abhängen. Normalerweise ist das ja die Mitte des Filters. Und nein, Matlab hab ich nicht und ich hab mich auch in deren Notation nicht eingearbeitet. Abgesehen davon läuft das Ganze offenbar auf bandpass-shift hinaus, nicht jedoch auf phase-shift. Also Verschieben der Eckfrequenzen und nicht der Phase des Signals. Je mehr ich drüber nachdenke, desto mehr habe ich den Eindruck, daß der OM damit etwas ganz anderes vorhat als ich. W.S.