用py写一个傅立叶变换,不调库,自己实现
时间: 2023-05-20 09:01:44 浏览: 126
好的,以下是一个用 Python 实现的傅立叶变换的代码:
```python
import math
def dft(x):
N = len(x)
X = [0] * N
for k in range(N):
for n in range(N):
X[k] += x[n] * math.e ** (-2j * math.pi * k * n / N)
return X
```
这个函数接受一个长度为 N 的实数序列 x,返回它的傅立叶变换 X。
相关问题
写一个快速实现傅里叶变换的matlab代码,禁止调库,参数完整。
以下是一个快速实现傅里叶变换的 Matlab 代码,使用了 Cooley-Tukey 快速傅里叶变换算法(FFT 算法):
```matlab
function [X] = myFFT(x)
% 快速傅里叶变换
% x: 输入信号
% X: 输出信号
N = length(x);
if N == 1
X = x;
return;
end
if mod(N, 2) ~= 0
error('输入信号长度必须是2的整数倍');
end
% 分治递归计算 DFT
x_even = x(1:2:N);
x_odd = x(2:2:N);
X_even = myFFT(x_even);
X_odd = myFFT(x_odd);
% 合并 DFT 结果
X = zeros(1, N);
for k = 1:N/2
X(k) = X_even(k) + exp(-2*pi*1i*(k-1)/N) * X_odd(k);
X(k+N/2) = X_even(k) - exp(-2*pi*1i*(k-1)/N) * X_odd(k);
end
end
```
该代码实现了一个基于递归的快速傅里叶变换算法,输入信号长度必须是 2 的整数倍。可以将该代码保存为 `myFFT.m` 文件,然后在 Matlab 命令行中使用 `myFFT(x)` 函数进行傅里叶变换。例如:
```matlab
% 生成一个长度为 8 的正弦信号
x = sin(2*pi*0.25*(0:7));
% 计算傅里叶变换
X = myFFT(x);
% 绘制频谱图
f = (0:length(x)-1)/length(x);
figure();
stem(f, abs(X));
xlabel('频率');
ylabel('幅度');
title('傅里叶变换结果');
```
这段代码将生成一个长度为 8 的正弦信号,然后计算该信号的傅里叶变换,并绘制频谱图。
帮我用Python写一段代码实现abod算法 不能调库
好的,下面是使用 Python 实现 ABOD(Angle-Based Outlier Detection)算法的代码(没有使用库):
```python
import numpy as np
def ABOD(X, k):
"""
X: 二维矩阵,每行是一个样本,每列是一个特征
k: k-近邻的 k 值
"""
n = X.shape[0]
ABO_scores = np.zeros(n)
for i in range(n):
dist = np.linalg.norm(X - X[i], axis=1)
knn_idx = np.argsort(dist)[1:k+1] # 排序后的索引,距离最近的是自己,所以从 1 开始取
knn = X[knn_idx]
center = np.mean(knn, axis=0)
cov_mat = np.cov(knn.T)
inv_cov_mat = np.linalg.inv(cov_mat)
ABO_scores[i] = np.sum((knn - center) @ inv_cov_mat * (knn - center), axis=1).mean()
return ABO_scores
```
其中,`X` 是一个二维矩阵,每行是一个样本,每列是一个特征。`k` 是 k-近邻的 k 值。函数返回每个样本的 ABOD 得分,得分越高表示越可能是异常点。
阅读全文