Phương pháp FFT và ứng dụng

Posted by Hao Do on September 3, 2023

Phương pháp FFT và ứng dụng

Phương pháp FFT và ứng dụng

Dưới đây là một số khái niệm cơ bản về FFT (Fast Fourier Transform)

cùng với một ví dụ mã Python cho việc sử dụng thư viện NumPy để thực hiện FFT trên một dãy số 1D.

Khái niệm cơ bản về FFT:

  • Tín hiệu thời gian: Đây là dãy số đại diện cho các giá trị của tín hiệu theo thời gian. Ví dụ: âm thanh, sóng điện,…

  • Tín hiệu tần số: Đây là dãy số đại diện cho cường độ của tín hiệu ở các tần số khác nhau.

  • Biến đổi FFT: Là quá trình chuyển đổi từ tín hiệu thời gian sang tín hiệu tần số bằng cách tính toán các phổ tần số.

  • Phổ tần số: Là biểu đồ hiển thị cường độ của các tần số trong tín hiệu.

  • Ngưỡng tần số: Mức cường độ tần số được chọn để xác định tần số thực sự và nhiễu.

Ví dụ 1: Loại bỏ nhiễu từ tín hiệu âm thanh:**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

# Đọc file âm thanh
sample_rate, audio_data = wavfile.read('audio.wav')

# Thực hiện FFT trên tín hiệu âm thanh
fft_result = np.fft.fft(audio_data)
frequencies = np.fft.fftfreq(len(fft_result), d=1/sample_rate)

# Loại bỏ tần số nhiễu bằng cách đặt cường độ tại các tần số nhiễu về 0
noise_threshold = 1000  # Giả sử tần số nhiễu có cường độ dưới ngưỡng này
fft_result[np.abs(fft_result) < noise_threshold] = 0

# Thực hiện FFT ngược để tái tạo tín hiệu
filtered_audio = np.fft.ifft(fft_result)

# Hiển thị kết quả
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(audio_data)
plt.title("Tín hiệu âm thanh gốc")

plt.subplot(2, 1, 2)
plt.plot(filtered_audio.real)
plt.title("Tín hiệu âm thanh đã loại bỏ nhiễu")
plt.tight_layout()
plt.show()

Ví dụ 2: Phân tích hình ảnh bằng FFT:**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from scipy.fftpack import fftshift

# Đọc hình ảnh
image = data.camera()

# Thực hiện FFT 2D
fft_image = np.fft.fft2(image)
fft_image_shifted = fftshift(fft_image)  # Dịch chuyển trung tâm để hiển thị

# Hiển thị kết quả
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title("Hình ảnh gốc")

plt.subplot(1, 2, 2)
plt.imshow(np.log(np.abs(fft_image_shifted)), cmap='gray')
plt.title("Biểu đồ phổ tần số")
plt.tight_layout()
plt.show()

Ví dụ mã Python sử dụng NumPy:**

Dưới đây là một ví dụ đơn giản về cách sử dụng FFT trong Python bằng thư viện NumPy. Trong ví dụ này, chúng ta sẽ tạo một tín hiệu hình sin và sau đó thực hiện FFT để xem cường độ của các tần số.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import matplotlib.pyplot as plt

# Tạo một tín hiệu hình sin với tần số 5 Hz và thời gian 1 giây
sample_rate = 1000  # Tốc độ lấy mẫu (samples per second)
duration = 1.0     # Thời gian (seconds)
t = np.arange(0, duration, 1/sample_rate)  # Mảng thời gian
frequency = 5       # Tần số của hình sin (Hz)
signal = np.sin(2 * np.pi * frequency * t)

# Thực hiện FFT
fft_result = np.fft.fft(signal)
frequencies = np.fft.fftfreq(len(fft_result), d=1/sample_rate)  # Tần số tương ứng với các thành phần FFT

# Hiển thị kết quả
plt.subplot(2, 1, 1)
plt.plot(t, signal)
plt.title("Tín hiệu hình sin")

plt.subplot(2, 1, 2)
plt.plot(frequencies, np.abs(fft_result))
plt.title("Biểu đồ phổ tần số")
plt.xlabel("Tần số (Hz)")

plt.tight_layout()
plt.show()

Mã trên sẽ tạo một tín hiệu hình sin với tần số 5 Hz, sau đó thực hiện FFT và vẽ biểu đồ phổ tần số của tín hiệu.

Dưới đây là ví dụ khác về việc sử dụng FFT trong xử lý hình ảnh để làm mờ hình ảnh:

Ví dụ: Làm mờ hình ảnh bằng FFT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color
from scipy.fftpack import fft2, ifft2

# Đọc hình ảnh và chuyển sang độ xám
image = io.imread('image.jpg')
gray_image = color.rgb2gray(image)

# Thực hiện FFT 2D
fft_image = fft2(gray_image)
fft_image_shifted = np.fft.fftshift(fft_image)

# Tạo bộ lọc thông thấp
rows, cols = gray_image.shape
cutoff = 0.1  # Tần số cắt
low_pass_filter = np.zeros_like(fft_image_shifted)
low_pass_filter[int(rows/2 - rows/2*cutoff):int(rows/2 + rows/2*cutoff),
                int(cols/2 - cols/2*cutoff):int(cols/2 + cols/2*cutoff)] = 1

# Áp dụng bộ lọc thông thấp bằng cách nhân phổ tần số với bộ lọc
filtered_fft_image_shifted = fft_image_shifted * low_pass_filter

# Thực hiện FFT ngược để tái tạo hình ảnh sau khi làm mờ
blurred_image = np.abs(ifft2(np.fft.ifftshift(filtered_fft_image_shifted)))

# Hiển thị kết quả
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(gray_image, cmap='gray')
plt.title("Hình ảnh gốc")

plt.subplot(1, 2, 2)
plt.imshow(blurred_image, cmap='gray')
plt.title("Hình ảnh đã làm mờ bằng FFT")
plt.tight_layout()
plt.show()

Using FFT (Fast Fourier Transform) for data transmission via satellite

is a concept that involves transforming data from the time domain into the frequency domain using FFT before transmission. Here’s a general overview of how this process might work:

  1. Data Preparation: The data that needs to be transmitted is prepared and segmented into blocks or frames. These blocks could represent a fixed duration of the signal, such as a second or a few milliseconds.

  2. FFT Transformation: Each data block is subjected to FFT, which transforms the data from the time domain into the frequency domain. This transformation converts the data from its original waveform representation into a representation of its constituent frequency components.

  3. Frequency Domain Data: After applying FFT, you have transformed data in the frequency domain. This data now represents the amplitude and phase of various frequency components present in the original signal.

  4. Modulation: The frequency domain data can be modulated onto a carrier signal that will be transmitted via the satellite link. Various modulation techniques, such as Quadrature Amplitude Modulation (QAM), Phase Shift Keying (PSK), or Frequency Shift Keying (FSK), can be used.

  5. Transmission: The modulated carrier signal is transmitted via satellite to the receiving end.

  6. Reception: At the receiving end, the transmitted signal is received from the satellite and processed to demodulate it back into the frequency domain data.

  7. Inverse FFT Transformation: The demodulated frequency domain data is subjected to the inverse FFT, which transforms the data back from the frequency domain to the time domain. This process reconstructs the original signal, although there might be some loss of fidelity due to noise, interference, and the modulation-demodulation process.

  8. Data Reconstruction: The received and inverse-transformed data blocks are combined to reconstruct the complete original dataset.

Using FFT in this way for data transmission via satellite can have advantages in terms of efficient use of bandwidth and improved resistance to certain types of interference, especially if the transmitted signal spans a wide frequency range. However, this approach might also introduce latency due to the time required for the transformation processes (FFT and its inverse).

It’s important to note that the implementation details and optimizations can vary based on the specific satellite communication system, modulation scheme, and signal characteristics.

Tài liệu tham khảo

Internet

Hết.