打印File目录树状结构原理_控制台打印_递归算法

import java.io.File;

public class FileTree {
	
	public static void main(String[] args) {
		File f=new File("d:/BaiduYunDownload");
		printTree(f,0);
	}
		
		
		public static void printTree(File f,int level){
			for(int i=0;i<level;i++){
				System.out.print("-");
			}
			System.out.println(f.getName());
			
			if(f.isDirectory()){
				File files[]=f.listFiles();//获取当前目录下所有文件和文件夹
				for(File temp:files)
				printTree(temp,level+1);//递归调用
			
			}else return;//不是目录就返回调用处

	}
}

要使用fopen_s函数来求wav文件的时域信号功率谱,需要先打开wav文件,并读取其中的音频数据。然后,使用FFT算法将其转换为频域信号,并计算功率谱。 以下是一个C++示例代码,可以帮助您完成此操作: ```c++ #include <iostream> #include <fstream> #include <cmath> #include <vector> using namespace std; const int SAMPLE_RATE = 44100; //采样率 const int FFT_SIZE = 1024; //FFT点数 const double PI = 3.14159265358979323846; //复数结构体 struct Complex { double real; double imag; }; //FFT算法 void fft(vector<Complex>& x) { int n = x.size(); if (n <= 1) return; //分离奇偶点 vector<Complex> even(n / 2), odd(n / 2); for (int i = 0; i < n / 2; ++i) { even[i] = x[i * 2]; odd[i] = x[i * 2 + 1]; } //递归FFT fft(even); fft(odd); //合并结果 for (int k = 0; k < n / 2; ++k) { Complex t = polar(1.0, -2 * PI * k / n) * odd[k]; x[k] = even[k] + t; x[k + n / 2] = even[k] - t; } } //计算功率谱 vector<double> calcPowerSpectrum(const vector<double>& signal) { int signalSize = signal.size(); vector<Complex> x(signalSize); //将信号复制到复数数组中 for (int i = 0; i < signalSize; ++i) { x[i].real = signal[i]; x[i].imag = 0; } //进行FFT变换 fft(x); //计算功率谱 vector<double> powerSpectrum(signalSize / 2); for (int i = 0; i < signalSize / 2; ++i) { powerSpectrum[i] = x[i].real * x[i].real + x[i].imag * x[i].imag; } return powerSpectrum; } int main(int argc, char* argv[]) { if (argc < 2) { cout << "Usage: " << argv[0] << " filename" << endl; return 1; } //打开wav文件 FILE* file; if (fopen_s(&file, argv[1], "rb")) { cout << "Failed to open file " << argv[1] << endl; return 1; } //读取wav头部信息 char chunkId[4]; int chunkSize; char format[4]; char subchunk1Id[4]; int subchunk1Size; short audioFormat; short numChannels; int sampleRate; int byteRate; short blockAlign; short bitsPerSample; char subchunk2Id[4]; int subchunk2Size; fread(chunkId, sizeof(char), 4, file); fread(&chunkSize, sizeof(int), 1, file); fread(format, sizeof(char), 4, file); fread(subchunk1Id, sizeof(char), 4, file); fread(&subchunk1Size, sizeof(int), 1, file); fread(&audioFormat, sizeof(short), 1, file); fread(&numChannels, sizeof(short), 1, file); fread(&sampleRate, sizeof(int), 1, file); fread(&byteRate, sizeof(int), 1, file); fread(&blockAlign, sizeof(short), 1, file); fread(&bitsPerSample, sizeof(short), 1, file); fread(subchunk2Id, sizeof(char), 4, file); fread(&subchunk2Size, sizeof(int), 1, file); //读取音频数据 int dataSize = subchunk2Size / blockAlign; vector<short> audioData(dataSize); fread(&audioData[0], sizeof(short), dataSize, file); //关闭文件 fclose(file); //将音频数据转换为双精度浮点数 vector<double> signal(dataSize); for (int i = 0; i < dataSize; ++i) { signal[i] = audioData[i] / 32768.0; } //计算功率谱 vector<double> powerSpectrum = calcPowerSpectrum(signal); //输出结果 for (int i = 0; i < powerSpectrum.size(); ++i) { cout << i * SAMPLE_RATE / FFT_SIZE << "Hz: " << powerSpectrum[i] << endl; } return 0; } ``` 在此示例代码中,我们使用fopen_s函数打开指定的wav文件,并读取其中的音频数据。然后,我们将音频数据转换为双精度浮点数,并使用FFT算法将其转换为频域信号。最后,我们计算功率谱,并将结果输出到控制台
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值