Làm thế nào để thay đổi phổ tần số?


7

Hãy nói rằng chúng ta có phổ từ -X MHz đến + X MHz. Tôi sẽ cần phải sửa lỗi tần số trong phổ bằng cách dịch chuyển thành phần 0 sang giữa (0 Hz).

Nếu đầu ra (phổ tần số) được tính toán qua FFT, theo như tôi biết, tôi có thể di chuyển phổ bằng cách điều chỉnh 'hệ số twiddle' (hoặc hệ số, đối với sóng sin và cosin dữ liệu phức tạp).

Trong trường hợp kích thước 1024 FFT (chỉ số bin từ 0 đến 1023), thành phần 0 Hz nên tồn tại trong số bin 511. Tuy nhiên, do lỗi tần số có thể, thành phần 0 hz thực sự có thể nằm trong bin 510 chẳng hạn.

Tôi dường như không thể tìm thấy nhiều thông tin về điều này. Bất kỳ trợ giúp đánh giá cao.

EDIT: Sai lầm trong câu hỏi.


2
0 Hz là trong thùng 0, không? Giữa FFT là tần số cao
endolith

1
Điều này sẽ phụ thuộc hoàn toàn vào thuật toán được sử dụng. Tuy nhiên, một cách đơn giản để nghĩ về nó là chỉ vẽ các sóng: wolfram alpha
user1166780

Làm thế nào tôi nghĩ rằng nó hoạt động là: Tùy thuộc vào nơi sử dụng hệ số tần số cao nhất, sẽ là vị trí của thành phần tần số cao nhất. Tuy nhiên tôi không thể giải thích các quy tắc về lý do tại sao một số thuật toán có thể có đầu ra của chúng ở các vị trí khác nhau, v.v. (ngoài việc sắp xếp lại chúng cuối cùng).
user1166780

Liên kết Wolfram alpha nên có điều này: cos ((2 * pi / 512) * x * 500) + i * sin ((2 * pi / 512) * x * 500), dường như không hoạt động tho. Thay đổi 500 thành 1 và thấy sự khác biệt. Nếu bạn nhập 0 và 0, tần số là của 0. Nhưng nếu cuối cùng chúng tôi sắp xếp lại chúng (bao gồm dữ liệu của chúng tôi là từ -một cái đến + một cái gì đó), chúng tôi có thể có thành phần 0 Hz ở giữa.
dùng1166780

Câu trả lời:


8

Nếu sự thay đổi tần số mà bạn muốn là bội số của khoảng cách bin, như trong ví dụ của bạn, thì bạn có thể dễ dàng thực hiện thay đổi mà bạn muốn bằng cách chỉ xoay các đầu ra FFT theo số lượng thùng bạn cần. Trong trường hợp phổ biến hơn là phần bù tần số không phải là bội số nguyên của khoảng cách bin, thì bạn có thể nhân tín hiệu bằng hàm số mũ phức tạp trước khi thực hiện FFT.

Vì vậy, nếu bạn xác định rằng thành phần tần số trung tâm mà bạn nói đến thực sự nằm ở tần số Hz trong dữ liệu của bạn và dữ liệu được lấy mẫu ở tốc độ Hz, thì để thay đổi phổ sao cho thành phần quan tâm là ở tần số 0 trong đầu ra FFT, bạn sẽ làm:foffsetfs

xshifted[n]=x[n]ej2πfoffsetnfs,  n=0,1,,N1

Yshifted[k]=FFT[xshifted[n]]

1
Cảm ơn vì điều này, nhưng bạn đã tìm thấy thông tin này ở đâu?
user1166780

Chà, đừng bận tâm, 'sự thay đổi tần số nhân theo cấp số nhân phức tạp' hoặc tương tự là từ khóa tôi đang tìm kiếm. Cảm ơn một lần nữa.
user1166780

1
Đây là một thuộc tính cơ bản của biến đổi Fourier rời rạc , trong đó FFT chỉ là một triển khai hiệu quả. Các biến đổi khác trong họ Fourier có các thuộc tính tương tự của riêng chúng, nhưng có sự khác biệt tinh tế trong mỗi loại.
Jason R

Tôi bối rối. Tôi đang cố gắng sử dụng điều này để (chuyển) tín hiệu miền thời gian thực bằng cách sử dụng FFT. Dịch chuyển mẫu số nguyên hoạt động tốt, nhưng khi tôi cố gắng dịch chuyển một nửa mẫu, kết quả sẽ trở nên tưởng tượng và trông không giống với bản gốc (bản gốc là đối xứng chẵn, kết quả là đối xứng lẻ). Tương tự cho chiều dài lẻ hoặc chẵn.
endolith

@endolith: Tôi không chắc bạn đang cố gắng làm gì ở đó. Câu trả lời tôi đưa ra ở trên là dễ dàng áp dụng sự thay đổi tần số cho tín hiệu. Bạn đang cố gắng áp dụng một độ trễ phân đoạn?
Jason R

-2

tốt, cách đơn giản là, nếu bạn đã sử dụng vật cản để tìm quang phổ, và bạn cần biết tần số của nó bằng cách dịch chuyển bao nhiêu, bạn có thể làm một điều ..

1) tìm ra phản ứng thúc đẩy từ quang phổ đó

2) kết hợp nó với một tiếng ồn

3) xem tín hiệu mà bạn có được 4) chỉ lấy FFT của nó để chắc chắn, nếu nó khớp với tín hiệu trước đó

4) và xem phổ bằng cách lấy trung bình các phần khác nhau ... vì điều này tôi có thể đưa ra thuật toán ua trong phần mềm mathicala, đó là

reflect[a_] := Module[{n = Length[a]},
  RotateRight[a, Floor[n/2]]
  ]

freqAxis[len_] := Module[{},
   If[OddQ[len],
    Range[1, len] - (Ceiling[len/2.]),
    Range[1, len] - (1 + Ceiling[len/2.])
    ]
   ];

colors = {Black, Red, Blue, Brown , ColorData["Legacy", "DarkGreen"], 
   ColorData["Legacy", "Goldenrod"], ColorData["Legacy", "DeepPink"], 
   Cyan, Orange, Purple, ColorData["Legacy", "DeepSkyBlue"], Magenta};

specPlot[pieces_, pieceLen_, color_] := 
 Module[{data, spec, fAxis, pos},
  fAxis = freqAxis[pieceLen];
  data = Partition[Take[mysignal, pieces*pieceLen], pieceLen];
  spec = Total[Abs[Fourier[data]]^2]/pieces;
  spec = reflect[spec];
  Print["valley=", Nearest[spec, 1.0][[1]], " atPos=", 
   pos = Position[spec, Nearest[spec, 1.0][[1]]][[1, 1]], " atFpos=", 
   Position[fAxis, 0][[1, 1]], " atF=", fAxis[[pos]], " firstMax=", 
   Max[Take[spec, Round[pieceLen/2]]], " atF=", 
   fAxis[[Position[spec, Max[Take[spec, Round[pieceLen/2]]]][[1, 
     1]]]], " lastMax=", Max[Take[spec, -Round[pieceLen/2]]], " atF=",
    fAxis[[Position[spec, Max[Take[spec, -Round[pieceLen/2]]]][[1, 
     1]]]]];
  ListLinePlot[Transpose[{fAxis, spec}], PlotStyle -> colors[[color]],
    PlotLabel -> "N = " <> ToString[pieces], PlotRange -> All]
  ]

trong mã này, tôi có một đối số để lấy pmsesignal, vì vậy bạn có thể sử dụng tín hiệu của riêng bạn thay vì nó ..

tôi không chắc chắn, tôi đã giải thích điều này tốt như thế nào, nhưng điều này đã làm việc trong trường hợp của tôi ..

Chúc mừng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.