Ik denk dat freqz
in een MATLAB-toolbox de manier is om DTFT te verkrijgen van volgorde. freqz
kan de frequentierespons berekenen van:
H (z) = (Num) / (Den)
We kunnen eenvoudig de z-transformatie van elke eindige reeks x(n)
als volgt berekenen:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
We weten in bovenstaande uitdrukking dat de Den
, 1 is.
Herinnerend dat: freeqz(num,den,n)
geeft de stapresponsie in n punt. Door x is de vector van x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
geeft ons de DTFT.
1) Is het (bovenstaande instructie) correct? wat gebeurt er als we onze polynoom verschuiven ?? waarom?
De tweede manier is om de DTFT-formule volledig te berekenen, als volgt:
[X, W]=me_dtft(x1",pi,3000); figure title("my") % plot(W/pi,20*log10(abs(X))); plot(W/pi,abs(X)) ax = gca; % ax.YLim = [-40 70]; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude (dB)") function [X, w]=me_dtft(x,whalfrange, nsample) w= linspace(-whalfrange,whalfrange,nsample); t=0:1:size(x,2)-1; X=zeros(1,size(w,2)); for i=1:1:size(w,2) X(i)=x*exp(-t*1i*w(i))"; end end
2) Ik heb door de war, is het bereik van parameter t
in bovenstaande code, belangrijk?
3) Is deze implementatie correct? Waarom?
Ik denk dat er dissonantie moet zijn, aangezien de afbeelding: Ons iets verkeerds vertellen! Deze transformatie is afkomstig van een zuivere sinusgolf (de code staat in de afbeelding), van rechts zie je de fft
, freqz
door de manier uitgelegd bovenaan en (links) de DTFT zoals eerder uitgelegd.
Bewerk na de opmerking van “Jason R”: Ok, ik heb ook de logaritmische schaal verwijderd, omdat het me in verwarring brengt. Daarna zijn je intuïtief gelijk, zoals je kunt zien in de volgende afbeelding, maar waarom zijn ze niet precies hetzelfde (verwijs naar laatste afbeelding op logaritmische schaal?)?
freqz
:
[x1freqz, x1freqzw]=freqz(fliplr(XX"),1,3000,"whole"); figure title("freqz") % plot((x1freqzw/pi)-1,20*log10(abs(fftshift(x1freqz)))) plot((x1freqzw/pi)-1,abs(fftshift(x1freqz))) ax = gca; % ax.YLim = [-40 70]; ax.XTick = -1:.5:2; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude")
Sinusvoorbeeld:
Fs=1000; Ts=1/Fs; time=0:Ts:1; Freqs=500; Xs=zeros(length(Freqs),length(time)); for i=1:length(Freqs) Xs(i,:)= cos(2*pi*Freqs(i)*time); end XX=Xs; XX=XX./ max(abs(XX)); figure;plot(time, XX); axis(([0 time(end) -1 1])); xlabel("Time (sec)"); ylabel("Singal Amp."); title("A sample audio signal"); sound(XX,Fs)
Reacties
- Je moet een compleet script posten dat de plots genereert die je gegeven.
- Een verschil is dat ik zie dat je in je code de DTFT plot van -fs / 2 naar + fs / 2, terwijl de FFT in vergelijking van 0 naar fs gaat. (maar je kunt gebruiken ” fft shitt “) Zonder al je code te zien, vermoed ik dat het verschil in de twee plots een afrondingsfout is die zou worden verminderd door meer punten op te nemen en / of door naar dubbele precisie-floats te gaan. Merk op dat de DTFT een Sinc-functie zal zijn waarvan de FFT samples zal zijn, tenzij u een sinusgolf creëert met een frequentie die een geheel getal onder veelvoud is van de samplefrequentie. Weet ook dat je samples van de DTFT kunt krijgen door de FFT op nul te zetten.
- @DanBoschen in fft-getal, 1000 betekent fs / 2?
- Nee 1000 betekent fs, je golfvorm is op fs / 2
- @DanBoschen Kun je meer uitleggen waarom ze (mijn DTFT en freqz, ik bedoel) niet precies hetzelfde zijn? Als ik de fft vul, zal sinc verschijnen?
Answer
De gebruikte linspace-functie gaat van – fs / 2 tot + fs / 2 voor 3000 samples, dus de + fs / 2 wordt twee keer geteld. In tegenstelling hiermee dupliceren de FFT en freqz, die van 0 naar N-1 gaan, de twee eindpunten niet (in dit geval gaan ze van DC naar 1 bin minder dan fs, waarbij fs de bemonsteringssnelheid is). Daarom zijn de voorbeeldlocaties niet exact hetzelfde, wat leidt tot het waarneembare verschil in de twee freqz-methoden.
Verder kun je samples van de DTFT krijgen door nul padding als een andere optie: fft (x, 3000).
In plaats van linspace, wat prima werkt als je de juiste start en stop kiest, doe ik graag:
t = [0: length (x) -1] * 1 / fs
Opmerkingen
- Ja om uw tweede vraag te beantwoorden. Ik denk dat uw benadering correct is. Zodra u de voorbeeldlocaties heeft hersteld, moeten de resultaten overeenkomen.
- Die ‘ s werkten best goed, maar mijn tweede vraag was: 2) Ik verwarde, is het bereik van parameter t in bovenstaande code, belangrijk?
- Ah, ik begrijp het — Nou, het bereik van t is het aantal samples. U hebt de standaard 512 samples in freqz overschreven naar bijvoorbeeld 3000, waardoor u meer samples van dezelfde DTFT kreeg. Dat gezegd hebbende, verandert het bereik niet ‘ het antwoord voor de samples die je kiest, maar geeft je meer samples in je resultaten. Bijvoorbeeld, zelfs in uw geval waarin u twee verschillende antwoorden had omdat de steekproeven een iets andere t-waarde hadden, zag u in beide gevallen dezelfde DTFT, slechts iets verschillende locaties op dezelfde (continue) curve. (De DTFT is een continue functie van frequentie).
- Ik denk dat je de
w
parameter hebt uitgelegd, niett
, isn ‘ niet dat?t
moet tijdsignaalindexen overschrijven, maar index kan afzonderlijk vant
in de exponentiële modus worden aangestuurd.we kunnen verschillendet
gebruiken zoals gebruikt in de index van ons signaal, in een beter schema kunnen we dat bereik verschuiven voordat we exponentieel berekenen, wat ‘ s het ‘ s impact? - In je formule moet t dezelfde lengte hebben als x. Als u het aantal samples in t verhoogt, moet u meer samples in x hebben, wat meer frequentieprecisie in uw DTFT betekent (het Sinc-patroon dat u in frequentie ziet, heeft nullen dichter bij elkaar). Wanneer het aantal samples in x, t en frequentie allemaal overeenkomen, berekent u de DFT (hoewel de lange weg vergeleken met de FFT — dat is waarom een nul opgevulde FFT een veel efficiëntere benadering voor u zou zijn om samples te berekenen van de DTFT, of gebruik gewoon freqz zoals je hebt gedaan)